利用VS2015实现C++与matlab混合编程:
2018-01-24 00:33
579 查看
鉴于Matlab对于一些科学运算以及数据分析等十分方便,又鉴于很多人习惯于编写C++代码,因此C++和matlab混合编程成为了我们的需求。
一种非常方便的方法是用C++调用matlab引擎,以直接调用matlab进行编程,具体步骤如下:
1) 在VS2015中配置项目包含目录
2) 在VS2015中配置项目库目录
3) 安装matlab2016b,安装路径为D:\Program Files\MATLAB\R2016b
4) 添加D:\Program Files\MATLAB\R2016b\bin\win64和D:\ProgramFiles\MATLAB\R2016b\bin\win32到path环境变量
5) 打开matlab2016b,在命令窗口中依次运行以下命令:
mex -setup
mbuild -setup
(不要直接复制粘贴,否则可能会因字符编码问题而运行出错。)
6) 完成上述步骤后,我们就可以写C++代码了。调用matlab的库函数简介如下:
例子:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"engine.h"
// 添加matlab引擎库的头文件
// 导入相关lib库
#pragmacomment(
lib, "libeng.lib")
#pragmacomment(
lib, "libmx.lib")
#pragmacomment(
lib, "libmat.lib")
int main()
{
Engine *ep;
//
启动引擎
if (!(ep = engOpen("\0")))
{
fprintf(stderr,
"\n打开Matlab引擎失败!\n");
returnEXIT_FAILURE;
}
//
执行:
int Nsample = 50;
constdouble PI = 3.1415926;
double *t =
newdouble[Nsample];
for (int i = 0; i <Nsample; i++)
{
t[i]= i * 2 * PI / Nsample;
}
mxArray *T =
NULL, *result =
NULL;
T= mxCreateDoubleMatrix(1,Nsample,
mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, Nsample *
sizeof(t[0]));
engPutVariable(ep,"X", T);
// 把变量T存入Matlab工作区
//
执行Matlab命令
engEvalString(ep,"Y=cos(X);");
engEvalString(ep,"plot(X,Y);");
engEvalString(ep,"title('y=cos(x)');");
engEvalString(ep,"xlabel('x');");
engEvalString(ep,"ylabel('y');");
fgetc(stdin);
//
清除对象,不能漏!
mxDestroyArray(T);
engEvalString(ep,"close;");
//
关闭引擎,不能漏!
engClose(ep);
returnEXIT_SUCCESS;
}
运行效果如下图:
一种非常方便的方法是用C++调用matlab引擎,以直接调用matlab进行编程,具体步骤如下:
1) 在VS2015中配置项目包含目录
2) 在VS2015中配置项目库目录
3) 安装matlab2016b,安装路径为D:\Program Files\MATLAB\R2016b
4) 添加D:\Program Files\MATLAB\R2016b\bin\win64和D:\ProgramFiles\MATLAB\R2016b\bin\win32到path环境变量
5) 打开matlab2016b,在命令窗口中依次运行以下命令:
mex -setup
mbuild -setup
(不要直接复制粘贴,否则可能会因字符编码问题而运行出错。)
6) 完成上述步骤后,我们就可以写C++代码了。调用matlab的库函数简介如下:
引擎函数 | 功能描述 |
engOpen | 启动Matlab计算引擎 |
engGetArray | 从Matlab引擎获得一个Matlab矩阵,用于数据交换 |
engPutArray | 从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换 |
engEvalString | 执行一Matlab命令,如engEvalString(ep, "plot(T,Y);");其中ep为Engine指针 |
engOutputBuffer | 创建字符缓冲区,以获得Matlab文本输出 |
engOpenSingleUse | 打开一个单独的非共享的Matlab计算引擎 |
engClose | 关闭Matlab引擎 |
engSetVisible | 设置Matlab引擎 |
engGetVisible | 返回Matlab显示状体 |
engGetVariable | 从Matlab工作区(Workspace)获得一个变量 |
engPutVariable | 将指定名称的Matlab变量存入Matlab工作区 |
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"engine.h"
// 添加matlab引擎库的头文件
// 导入相关lib库
#pragmacomment(
lib, "libeng.lib")
#pragmacomment(
lib, "libmx.lib")
#pragmacomment(
lib, "libmat.lib")
int main()
{
Engine *ep;
//
启动引擎
if (!(ep = engOpen("\0")))
{
fprintf(stderr,
"\n打开Matlab引擎失败!\n");
returnEXIT_FAILURE;
}
//
执行:
int Nsample = 50;
constdouble PI = 3.1415926;
double *t =
newdouble[Nsample];
for (int i = 0; i <Nsample; i++)
{
t[i]= i * 2 * PI / Nsample;
}
mxArray *T =
NULL, *result =
NULL;
T= mxCreateDoubleMatrix(1,Nsample,
mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, Nsample *
sizeof(t[0]));
engPutVariable(ep,"X", T);
// 把变量T存入Matlab工作区
//
执行Matlab命令
engEvalString(ep,"Y=cos(X);");
engEvalString(ep,"plot(X,Y);");
engEvalString(ep,"title('y=cos(x)');");
engEvalString(ep,"xlabel('x');");
engEvalString(ep,"ylabel('y');");
fgetc(stdin);
//
清除对象,不能漏!
mxDestroyArray(T);
engEvalString(ep,"close;");
//
关闭引擎,不能漏!
engClose(ep);
returnEXIT_SUCCESS;
}
运行效果如下图:
相关文章推荐
- 通过汇编看vs2015下c++各标准库的实现原理
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- vs2015利用connector c++对数据库操作
- 利用VS根据文件目录结构创建C++工程自己简单实现的方法
- vs2013中使用matlab2014b引擎实现c++和matlab混合编程
- 【VS2015】c++实现windows系统版本、类型、语言识别
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- matlab2015和vs2013混合编程
- 利用Boost.Python实现Python C/C++混合编程
- 在VS2015中用C++创建DLL并用C++调用且同时实现对DLL的调试
- 小字典之MFC简单的多线程调用类的成员函数实现逐步画线功能 VS2015 C++ 完成
- C++和Matlab混合编程——VS调用Matlab函数
- 【VS2015】 C++实现硬件ID的查询
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- VS中利用swig实现c/c++导出python接口
- MATLAB和C/C++混合编程实现图像处理(一)
- 在VS2015中用C++创建DLL并用C++调用且同时实现对DLL的调试
- Matlab和C++混合编程——在matlab调试过程中可以跳入VS调试观察.cpp文件中的数据
- MATLAB和C/C++混合编程实现图像处理(一)
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试