1、VS2005如何调用Matlab7定义的.m文件中的函数
以一个简单的例子来说明一下如果在VC中调用matlab中定义的.m文件. 与Matlab6.5稍有不同。
(一) 先建立matlab的m文件
这里为了简单起见,我在matlab中定义了一个求和函数, 其m文件如下:
function y = add_zh(a,b)
y=a+b
保存为myadd.m
(二) 对matlab编译环境进行设置
为操作系统添加环境变量:在环境变量(我的电脑->右键->高级)path中加入
2、在命令行状态下键入: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
3、 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
4、Compiler: -------------------------------------------------------------------------------------- 这里我们选择 '7’。(如果使用其他的编译器,可以相应的选择) 然后,继续在命令行状态下输入: mbuild –setup -------------------------------------------------------------------------------------- Please choose your compiler for building standal
5、one 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+
6、 2008 SP1 [0] None -------------------------------------------------------------------------------------- 这里需要几步确认。大家按情况操作即可。 (三) 对VC的编译器环境进行设置 在"工具->选项->项目和解决方案->VC++目录"里面设置include和lib的路径,分别添加一项,指向matlab安装目录中的 \extern\include 和\extern\lib\win32\microsoft (四) 这一步比较关键。在这一步中,将matlab中的.m文件转
7、换为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工程 为了简单,我们在这里建立一个
8、空的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的编译环
9、境设置完毕。下面就是编程部分了。 (七) 编程部分的关键:接口和数据类型的转换 先给出VC实现的源代码: ------------------------------------------------------------------------ int main(void) { addtestInitialize(); //addtestInitialize是addtes.h中定义的函数的初始化函数 //为了调用matlab中的函数,必须使用数组数据类型,并其后调用matlab函数将其转化为矩阵格式(matlab的基本数据类型是矩阵)
10、 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),
11、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));
12、 cout< 13、信看到里面的注释,我们就明白的差不多了。
VC编程以实现对matlab函数的调用,例如VC中我们实现两个double型的相加,则需要做上述的编程:首先定义两个数组并存入我们要进行函数操作的数据(也就是所谓的实参);然后将这两个数组转换为matlab可以识别的矩阵;然后调用m文件中自定义的函数,对矩阵进行操作;最后将结果再转回VC支持的数据格式:
至此,经matlab函数处理过的数据已经存入了VC中的result变量。
大家可以看出来,在进行调用的时候,我们使用的是m文件的文件名myadd,而不是m文件中定义的函数名add_zh(a,b)。
* mex -setup中间有个空格。
++++++++++++++++++++++++++++++++++++++++++++++++++






