利用VS2015实现C++与matlab混合编程:

 鉴于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);");其中epEngine指针

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;
}

 运行效果如下图:


猜你喜欢

转载自blog.csdn.net/qq_33353186/article/details/79146234
今日推荐