C++调用matlab第二版
好吧,其实这个方法好久之前就想上来更的,但是前阵子实在是太忙了,嘛,新到手的ipad嘛~不好好玩ipad跑来更blog这是人干的事儿吗??加上前阵子还被自己老板的课给逼到蛋都碎了,上两个学分的课,花4个学分的力气。。唉,没办法,谁让是自己老板呢,不是的话第一次课上没一阵子就直接翘了~
正题,C++调用matlab,之前这里讲了一种matlab生成m文件的DLL的方法,好处在于可以很好的封装整个程序,但是如果你只是要调用一个函数什么的呢?比如fft(好吧,才不会有人调用fft还用matlab的。。,那。。。plot?)下面这个方法可以实现一个语句一个语句调用,方法就是使用matlab engine。
engine.h这个文件大家可以在X:/XXXXXX/MATLAB/R2009b/extern/include里面可以找到;
系统配置方面请参见这里的C++编译器配置一部分。
使用的时候首先添加下面的头文件和lib:
#include "engine.h" #include "matrix.h" #pragma comment(lib,"libeng.lib") #pragma comment(lib,"libmx.lib")
然后打开eigine:
Engine *ep; if(!(ep = engOpen(""))) { fprintf(stderr, "nCan't start MATLAB enginen"); return EXIT_FAILURE; }
上面之后程序会打开一个matlab的命令行控台,如果不想要,一般都不会希望还显示另一个窗口的吧,所以关掉~
engSetVisible(ep , false) ;
如果想构造矩阵并赋值,见下面代码:
mxArray *test_matrix = mxCreateDoubleMatrix(1,3,mxREAL); double num[3] = {1.0,2.0,3.0}; memcpy(mxGetPr(test_matrix),num,sizeof(num)) ;
不难吧,然后我之前说过这个方法可以一行一行matlab代码的执行,按照我的理解,你可以想象这个程序中有两个变量空间,一个是C++的变量,像上面的test_matrix啊,num什么的,这些都是C++的变量,另外一个变量空间是matlab的变量空间,我没考据过,估计变量是存储在eigine里面的,也就是说,假设你有一个数组,然后赋值在一个mxArray*指针变量里面,然后你想做fft,那么你就要先把这个指针变量的数据转到一个matlab变量空间的一个变量里面,然后在对这个matlab的变量做fft,然后再转回来。废话千行不如代码几行:
engPutVariable(ep , "Y" , test_matrix) ; engEvalString(ep, "X = 3 * Y"); engEvalString(ep,"figure"); engEvalString(ep,"plot(X)"); mxArray *X = engGetVariable(ep , "X") ;
看到了吧,C++变量空间转matlab变量空间就是用engPutVariable,转回来就是engGetVariable,每次单行执行一句matlab命令就是engEvalString,不难吧。
然后还有一些别的函数,比如获取数据的维数,mxArray*转double*:
//获取数据维数 int dims[2]; int dimension = mxGetNumberOfDimensions(test_matrix); memcpy(dims , mxGetDimensions(test_matrix) , dimension * sizeof(int)) ; //获取数据 double *double_x = (double*)mxGetData(test_matrix) ;
然后最后用完记得释放内存:
mxDestroyArray(test_matrix); mxDestroyArray(X); engClose(ep);
两种C++调用matlab的方法各有千秋,大家自己取舍,不过这种方法效率比较低下倒是真的了。。
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com