以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件. 与Matlab6.5稍有不同。
(一) 先建立matlab的m文件
这里为了简单起见,我在matlab中定义了一个求和函数, 其m文件如下:
function y = add_zh(a,b)
y=a+b
保存为myadd.m
(二) 对matlab编译环境进行设置
为操作系统添加环境变量:在环境变量(我的电脑->右键->高级)path中加入<MATLAB7_root>\bin\win32
打开matlab,在命令行状态下键入:mex -setup
然后出现如下提示:
--------------------------------------------------------------------------------------
Select a compiler:
[1] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
[2] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1 linker)
[3] Intel Visual Fortran 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
[4] Lcc-win32 C 2.4.1
[5] Microsoft Visual C++ 6.0
[6] Microsoft Visual C++ .NET 2003
[7] Microsoft Visual C++ 2005 SP1
[8] Microsoft Visual C++ 2008 Express
[9] Microsoft Visual C++ 2008 SP1
[10] Open WATCOM C++
[0] None
Compiler:
--------------------------------------------------------------------------------------
这里我们选择 '7’。(如果使用其他的编译器,可以相应的选择)
然后,继续在命令行状态下输入:
mbuild –setup
--------------------------------------------------------------------------------------
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? n
Select a compiler:
[1] Lcc-win32 C 2.4.1
[2] Microsoft Visual C++ 6.0
[3] Microsoft Visual C++ .NET 2003
[4] Microsoft Visual C++ 2005 SP1
[5] Microsoft Visual C++ 2008 Express
[6] Microsoft Visual C++ 2008 SP1
[0] None
--------------------------------------------------------------------------------------
这里需要几步确认。大家按情况操作即可。
(三) 对VC的编译器环境进行设置
在"工具->选项->项目和解决方案->VC++目录"里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的 \extern\include 和 \extern\lib\win32\microsoft
(四) 这一步比较关键。在这一步中,将matlab中的.m文件转换为dll
在matlab命令行中输入:
mcc -W lib:addtest -T link:lib myadd.m
-W lib:addtest 表示生成DLL所需的addtest.h addtest.lib addtest.dll
-T link:lib 表示编译生成的目标(Target)文件类型为DLL
至此,可以发现在myadd.m所在的目录中产生了一大堆文件。我们只用其中3个:
addtest.h addtest.lib addtest.dll
(五) 新建一个VC工程
为了简单,我们在这里建立一个空的Win32控制台应用程序来进行演示。
然后,将上面这3个文件拷贝到VC工程所在的目录中,以便VC调用之,并将 addtest.h 加入到当前工程中。
(六) 进行VC编程
首先,在cpp文件中加入:
#include “addtest.h”
#include “mclmcrrt.h”
#include “mclmcr.h”
然后,设置VC的链接库。在"项目->属性->属性配置->链接器->输入->附加依赖项"中添加
addtest.lib mclmcr.lib mclmcrrt.lib libmx.lib libmat.lib libeng.lib
至此,VC的编译环境设置完毕。下面就是编程部分了。
(七) 编程部分的关键:接口和数据类型的转换
先给出VC实现的源代码:
------------------------------------------------------------------------
int main(void)
{
addtestInitialize(); //addtestInitialize是addtes.h中定义的函数的初始化函数
//为了调用matlab中的函数,必须使用数组数据类型,并其后调用matlab函数将其转化为矩阵格式(matlab的基本数据类型是矩阵)
static double x1[4]={1.0,2.0,100.5,200.1};
static double x2[4]={2.5,13.2,200.5,10.5};
double result[4];
//调用matlab创建3个矩阵,经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值都需要转换成该种格式
mxArray *A=mxCreateDoubleMatrix(1,4,mxREAL); //创建一个1x4的矩阵A
memcpy(mxGetPr(A),&x1,4*sizeof(double)); //给矩阵赋值
mxArray *B=mxCreateDoubleMatrix(1,4,mxREAL);
memcpy(mxGetPr(B),&x2,4*sizeof(double));
mxArray *C=mxCreateDoubleMatrix(1,4,mxREAL);
mlfMyadd(1,&C,A,B); //调用m文件函数(注意:函数名myadd首字母必须大写)
memcpy(&result,mxGetPr(C),4*sizeof(double));
cout<<result[0]<<" "<<result[1]<<" "<<result[2]<<" "<<result[3]<<endl;
//释放矩阵
mxDestroyArray(A);
mxDestroyArray(B);
mxDestroyArray(C);
addtestTerminate();//中止调用
return 0;
}
------------------------------------------------------------------------
相信看到里面的注释,我们就明白的差不多了。
VC编程以实现对matlab函数的调用,例如VC中我们实现两个double型的相加,则需要做上述的编程:首先定义两个数组并存入我们要进行函数操作的数据(也就是所谓的实参);然后将这两个数组转换为matlab可以识别的矩阵;然后调用m文件中自定义的函数,对矩阵进行操作;最后将结果再转回VC支持的数据格式:
至此,经matlab函数处理过的数据已经存入了VC中的result变量。
大家可以看出来,在进行调用的时候,我们使用的是m文件的文件名myadd,而不是m文件中定义的函数名add_zh(a,b)。
* mex -setup中间有个空格。