在使用VS进行项目开发的时候需要使用matlab将处理数据作图显示,接下来给大家说明如何在vs中调用matlab
首先需要在VS中搭建调用matlab的环境
打开VS点击项目名称右键->属性,选择配置属性下的VC++目录
在包含目录中添加D:\matlab1\extern\include路径(根据电脑matlab安装位置)
在库目录中添加D:\matlab1\extern\lib\win64\microsoft路径
之后选择链接器->输入
在附加依赖项中添加库文件
libeng.lib
libmex.lib
libmx.lib
注意是在输入的附加依赖项添加而不是在常规的附加库目录中,网上好多教程说是添加到附加库目录里。
如果项目本身是作为库文件被其他项目调用的时候,项目属性中是没有链接器的
则在属性中的库管理器->常规->附加依赖项中添加上述库文件即可。
在VS中配置好环境后还需将matlab的库目录加入到电脑的环境变量里,
打开系统的环境变量设置
将D:\matlab1\bin\win64添加到环境变量Path的值中(注意,添加完成后需要将电脑重启后才有效)
至此,结束所有的环境配置,可以在VS中调用matlab了。
首先需要在头文件中引入matlab的引擎库#include<engine.h>
函数库已经在附加依赖库中添加了,所以在头文件中不用再添加
使用引擎指针打开matlab引擎
Engine *ep;
if(!(ep = engOpen(("\0"))))
{
fprintf(stderr,"\nCant' start MATLAB engine\n");
}
之后需要将VS中的变量引入matlab
MATLAB函数的输入和输出参数通常都是矩阵,在C++中矩阵变量使用mxArray这个类型
double t[10000] = {0};
int Nsample = 10000;
mxArray *T = NULL
定义一个矩阵指针,
T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
使用mxCreatedoubleMatrix(1, Nsample, mxREAL)函数创建一个具体的double类型的矩阵,其中第一个参数确定矩阵行数,第二个参数确定矩阵列数,第三个参数确定矩阵元素是复数还是实数。mxREAL为实数,mxCOMPLEX为复数,此处定义一个1行10000列,矩阵元素为实数且为double类型的矩阵。
memcpy((void *)mxGetPr(T), (void *)t, Nsample*sizeof(double));
使用memcpy函数将VS中变量赋值给创建的矩阵,其中第二个参数t为VS中变量的指针,同时需要使用mxGetPr(T)函数来获取矩阵的指针。
engPutVariable(ep, "T", T);
使用engPutVariable(ep, "T", T)函数将矩阵传入matlab,其中第一个参数是mtalab引擎指针,第二个参数是传入到matlab中的变量名,第三个参数VS中的矩阵变量名。
engEvalString(ep, "Y=sin(T);");
engEvalString(ep, "plot(T,Y);");
将VS中的变量传入matlab之后,便可使用engEvalString函数直接在matlab中使用该变量,完成绘图。
printf("Hit return to continue\n");
fgetc(stdin);
// clean operation(don't forget!!!)
mxDestroyArray(T);
engEvalString(ep, "close;");
// close engine
engClose(ep);
完成绘图记得关闭matlab引擎,以及销毁矩阵。
注:项目要求需要循环更新matlab曲线,此时频繁启动matlab引擎以及关闭matlab引擎会占用大量时间,此时可以在循环体外开启和关闭引擎以节约时间,并且由于启动matlab本身会占用大量时间,导致VS进程与matlab显示数据不对应,最好先启动matlab后台,再执行VS程序。
详细的VS与matlab混合编程可以看一下此链接