C++和MATLAB的混合编程(1)

因为需要使用滤波算法对数据进行滤波处理,自己对算法方面又不是很熟,通过查找了解到MATLAB中各种算法都已经很完善了,所以就想着学习一下使用MATLAB中的算法,后来也是各种百度,但是一直没有找到一个很好的,很完善的解决方案,最后通过多种了解查看,总算弄出一个可用的,这里总结一下在MATLAB混编遇到的问题,还有一些自己的认知。也给想要使用MATLAB混编的朋友一些大体的可行方案吧!

首先,安装一个MATLAB是必须的,在这里说明一下(据说使用MATLAB6.5及以下的版本,不会出现在没有MATLAB的电脑上无法使用自己软件的问题,本人由于时间问题没有尝试的使用,使用后如果可以解决在其他电脑使用问题,本人会在后面更新的时候说明)

这里介绍两种使用MATLAB的方法,先介绍一下本人使用的方法:
一、直接动态调用MATLAB库函数
1、安装MATLAB
2、在vs中创建工程,然后设置工程属性
设置VC++目录
设置C/C++/常规
链接器/常规
链接器/输入
这是对依赖库的设置等

2、可以在项目中进行MATLAB的函数使用了
在使用MATLAB的地方,添加头文件#include “engine.h”,
在使用的部分,对MATLAB进行打开引擎操作:

Engine *eg;
if(!(eg = engOpen(NULL)))
    MessageBoxA(NULL, "can't start MATLAB engine","MATLAB engine",MB_OK);

创建MATLAB矩阵内存块:

mxArray *imA;
imA=mxCreateDoubleMatrix(20,20,mxREAL);

设置,将自己的数据拷贝到矩阵中,并在MATLAB中创建对应的变量:

double A[20][20]
memcpy((void *)mxGetPr(imA),(void *)A,sizeof(A));
engPutVariable(eg,"im",imA);

在MATLAB中进行计算:

engEvalString(eg, "Wn=[0.5*2 35*2]/1000");
engEvalString(eg, "[k,l]=butter(1,Wn)");
engEvalString(eg, "im2=filtfilt(k,l,im)");

得到MATLAB中的数据,并拷贝到C++中的变量中:

imC =engGetVariable(eg,"im2");
double C[20][20];
memcpy((void *)C,(void *)mxGetPr(imC),sizeof(mxGetPr(imC))*20*20); 

释放矩阵内存:

mxDestroyArray(imA);

关闭引擎:

engClose(eg);

然后这个方法有一个问题,就是需要将用到的MATLAB中的dll文件拷贝到生成的版本中,dll文件在MATLAB路径的:

D:\Matlab\R2015b\bin\win64

然后就算完成。

二、生成dll文件在C++中调用
1、在MATLAB中创建m文件,使用MATLAB语句生成MATLAB可执行语句
2、在命令中使用:mcc -W lib:lib(m文件名) 文件.m -T link:lib ,将生成动态链接库,然后在C++中就可以调用
3、在使用的时候也需要设置MATLAB链接库

暂时还没有发现,使用引擎和动态库,在C++中使用有什么大的不同,希望,其他有更好方法的,可以在下面评论,不会的也可以参考使用引擎的方法,实现自己的编程目的。本人也会不断研究,不断提出新的方法。

猜你喜欢

转载自blog.csdn.net/bloke_come/article/details/72784345