首页 > Matlab > C++调用matlab第二版

C++调用matlab第二版

2013年1月14日 发表评论 阅读评论

好吧,其实这个方法好久之前就想上来更的,但是前阵子实在是太忙了,嘛,新到手的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

分类: Matlab 标签: ,