plhs[]与prhs[]都是指针数组,也就是说它是个数组,每个元素都是一个指针,这些指针指向的东东的类型是mxArray。那什么是mxArray呢?可以把他理解MATLAB中的矩阵,因为MATLAB中所有数据都是以矩阵的形式保存的。
先讲prhs[],就是输入的参数,prhs[0]指向a,prhs[1]指向b,但是注意不能用*(prhs[0])得到a的值。因为 prhs[0]指向的东西的类型是mxArray(参数列表里看出),想把它的值以我们常用的数值形式赋给一个标量(Scalar),得使用 mxGetScalar()函数转化一下:
double a, b;
a = mxGetScalar(prhs[0]);
b = mxGetScalar(prhs[1]);
plhs对应的输出的内容。plhs[0]这个指针指向输出的第一个参数,就是c=add(a, b)中的c了。记住这个c应该是以mxArray的类型出现的,为了得到mxArray类型的输出量,要使用mxCreateDoubleMatrix()函数,它创建一个指向mxArray类型的指针。
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
参数(1, 1, mxREAL)定义了对应c的尺寸类型,MATLAB中c是以1×1的实数矩阵形式报保存的。
而使用mxGetPr()函数可以得到plhs[0]指向的mxArray的第一个double类型的指针。
double *c;
c = mxGetPr(plhs[0]);
最后调用add()函数
*c=add(a,b);
(a) 在Matlab命令窗口输入命令
mex MyMEXFun.c
可以看到在当前目录生成新文件MyMEXFun.mexw32。在命令窗口中输入c=MyMEXFun(3,4)命令,可得到c=7。
(b) 对程序的调试有两种方法,第一种要借助相应语言的开发环境进行调试,只需要把mex 源文件文件在 Matlab 环境下编译的时候加上 debug 选项即可,例如我们编译一个名字为MyMEXFun.c的 mex 源文件,可以在 Matlab 的 command 窗口输入命令mex –g –v MyMEXFun.c即可。
(2) 在windows 环境下的调试方法。
打开VS2010->File->New->Project->VisualC++->MFC->MFC DLL,新建MFC DLL工程,选择DLL类型为Regular DLL with MFC statically linked,工程名为MexDemo。
为工程添加MyMEXFun.c文件,文件内容与上面相同。
打开文件MexDemo.def,在def文件的EXPORTS项添加mexFunction一行。
右键MexDemo->Properties->VC++Directories->Include Directories,添加目录:C:\ProgramFiles (x86)\MATLAB\R2011b\extern\include和目录C:\ProgramFiles (x86)\MATLAB\R2011b\extern\include\win32
右键MexDemo->Properties->VC++Directories->Library Directories,添加目录:C:\Program Files (x86)\MATLAB\R2011b\extern\lib\win32\microsoft
右键MexDemo->Properties->linker->input中增加Additional Dependencies中增加libmx.liblibmex.lib libmat.lib。
右键MexDemo->C/C++->Preprocessor中增加MATLAB_MEX_FILE
在Linker下output中将后缀改为mexw32,即$(OutDir)\$(ProjectName).mexw32
在需要的地方加入#include “stdafx.h”。
用Ctrl+Alt+P附加调试环境到Matlab,在Matlab中将当前目录更改为生成MyMEXFun.mexw32所在目录,在Matlab命令窗口输入函数调用语句,即可开始调试。
调用C/C++动态连接库
Matlab提供对动态连接库DLL文件的接口。利用该接口,可在Matlab中调用动态连接库导出的函数。Matlab对DLL的接口支持各种语言编写的DLL文件。在调用DLL文件之前,需要准备函数定义的头文件。对于C/C++语言开发的DLL文件,可使用源程序中相应的头文件;而对于其他语言开发的DLL,则要手工准备等效的C语言函数定义头文件。
在Matlab中利用动态连接库接口技术通常需要完成以下4个步骤:
(1)打开动态连接库文件;
(2)为调用函数准备数据;
(3)调用动态连接库文件中导出的函数;
(4)关闭动态连接库文件。
为了实现以上步骤,用到的Matlab函数有:loadlibrary, calllib, libfunctions, lipointer, libstruct,libisloaded等。下面举例说明Matlab调用C/C++动态连接库的方法和步骤:
打开VS2010->File->New->Project->VisualC++->MFC->MFC DLL,新建MFC DLL工程,选择DLL类型为Regular DLL with MFC statically linked,工程名为Test1。
为工程添加a.cpp文件,内容为:
#include "a.h"
_declspec(dllexport)intadd(inta,intb) {returna+b; }
为工程添加a.h文件,内容为:
_declspec(dllexport)intadd(inta,intb);
然后编译生成Test1.dll动态连接库文件,
将Test1.dll和a.h拷到Matlab 工作目录下。
在Matlab命令行下,调用Test.dll:
>>loadlibrary(‘Test1’,’a.h’);
>>x=7;
>>y=8;
>>calllib(‘Test1’,‘add’,x, y);
Ans=15
>>unloadlibrary(‘Test1’).