鉴于Matlab对于一些科学运算以及数据分析等十分方便,又鉴于很多人习惯于编写C++代码,因此C++和matlab混合编程成为了我们的需求。
一种非常方便的方法是用C++调用matlab引擎,以直接调用matlab进行编程,具体步骤如下:
1) 安装matlab2016b,安装路径为D:\Program Files\MATLAB\R2016b
2) 在VS2015的属性页-VC++目录中配置项目包含目录
D:\Program Files\MATLAB\R2016b\extern\include
3) 在VS2015的属性页-VC++目录中配置项目库目录
D:\Program Files\MATLAB\R2016b\extern\lib\win64\microsoft
4) 在VS2015的属性页-链接器-输入-附加依赖项中添加
libmat.lib;libeng.lib;libmx.lib;
5) 添加D:\Program Files\MATLAB\R2016b\bin\win64和D:\ProgramFiles\MATLAB\R2016b\bin\win32到path环境变量
6) 打开matlab2016b,在命令窗口中依次运行以下命令:
mex -setup C++
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库
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
int main()
{
Engine *ep;
// 启动引擎
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\n打开Matlab引擎失败!\n");
return EXIT_FAILURE;
}
// 执行:
int Nsample = 50;
const double PI = 3.1415926;
double *t = new double[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]));
// 把变量T存入Matlab工作区
engPutVariable(ep, "X", T);
// 执行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);
return EXIT_SUCCESS;
}
运行效果如下图: