C++和MATLAB的混合编程(1)
C++和MATLAB的混合编程(1)
因为需要使用滤波算法对数据进行滤波处理,自己对算法方面又不是很熟,通过查找了解到MATLAB中各种算法都已经很完善了,所以就想着学习一下使用MATLAB中的算法,后来也是各种百度,但是一直没有找到一个很好的,很完善的解决方案,最后通过多种了解查看,总算弄出一个可用的,这里总结一下在MATLAB混编遇到的问题,还有一些自己的认知。也给想要使用MATLAB混编的朋友一些大体的可行方案吧!
首先,安装一个MATLAB是必须的,在这里说明一下(据说使用MATLAB6.5及以下的版本,不会出现在没有MATLAB的电脑上无法使用自己软件的问题,本人由于时间问题没有尝试的使用,使用后如果可以解决在其他电脑使用问题,本人会在后面更新的时候说明)
这里介绍两种使用MATLAB的方法,先介绍一下本人使用的方法:
一、直接动态调用MATLAB库函数
1、安装MATLAB
2、在vs中创建工程,然后设置工程属性
这是对依赖库的设置等
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++中使用有什么大的不同,希望,其他有更好方法的,可以在下面评论,不会的也可以参考使用引擎的方法,实现自己的编程目的。本人也会不断研究,不断提出新的方法。
C++和MATLAB的混合编程(1)相关教程