从Matlab 2008开始才能支持VS2008,所以这里写一个例子介绍如何将二者结合,生成 .dll文件进行混合编程。 首先,为matlab安装mex和mbuild并配置好环境变量。 下面给出一个具体的实例进行讲解: 在matlab中写一个简单的inverse.m实现求矩阵的逆: function y=inverse(a,NUM) %NUM 是a的维数,这里没有什么实际意义 y=inv(a); 针对上面的例子创建状态链接库(在matlab中使用mcc命令): mcc -C -W cpplib:libinverse -T link:lib inverse.m 注意1:这里加了一个-C,这是因为在matlab2008中使用mcc -W cpplib:libinverse -T link:lib inverse.m.的时候,只会生成.lib .h .dll文件(注意,这四个文件的默认生成位置是:桌面。。\My Documents\MATLAB文件夹中),但并不会生成.ctf文件,那是因为matlab2008默认地把ctf文件放到别的文件中了,所以没有单独生成(你可以用mcc ?查一下),如果想要单独生成ctf文件,可以在里面加上-C这个选项,如上所示。 接下来,在VS2008中建立一个C++工程Test_matlab,使其调用这个.dll。把上面mcc命令生成的.lib .h .dll .ctf文件放到Test_matlab工程中,然后在VS中配置工程,需要配置以下几项: 打开project->Test_matlab_properties->C/C++->general->Addational Include Directories, 把MATLAB提供的include路径加到VC++的头文件搜索路 径加入。
打开project->Test_matlab_properties->Linker->general->Addational Library Directories, 把相应的lib所在目录加入。
打开project->Test_matlab_properties->Linker->Input->Addational Dependencies 把.lib 与mclmcrrt.lib加入,中间用空格。
最后,把.h添加到VC++程序中,其主程序如下(请转II): 注意2:有可能出现'mclInitializeApplication_proxy': identifier not found,错误 这是因为头文件的相对位置不对,把调用matlab的driver头文件放在#include "mclcppclass.h"的前边或者不用#include "mclcppclass.h",因为它就包含在调用matlab的driver头文件中。 // Test_matlab.cpp : Defines the entry point for the console application. //程序中包括我做的一些其它的测试,例如内存的写顺序,如何传递参数等等问题 //程序功能:VC++调用matlab中的inv函数,实现NUM*NUM矩阵的求逆
#include "libinverse.h" // DLL 头文件 #include "iostream" //#include "mclmcr.h" // mxArray 类型声明 using namespace std; int main() { // 初始化程序 int i,j; if( ! mclInitializeApplication(NULL,0) ) { fprintf(stderr, "Could not initialize the application.\n"); exit(1); } // 初始化库 if (! libinverseInitialize() ) { fprintf(stderr,"Could not initialize the library.\n"); exit(1); } printf("game over!\n"); int NUM=10; double **xx=new double*[NUM]; xx[0]=new double[NUM*NUM]; for(i=0;i<NUM;i++) { xx[i]=xx[0]+i*NUM; } double *x=new double[NUM*NUM]; for(i=0;i<NUM;i++) for(j=0;j<NUM;j++) { if(i==j) xx[i][j]=2; else xx[i][j]=0; } for( i=0;i<NUM;i++) for( j=0;j<NUM;j++) { x[i*NUM+j]=xx[j][i]; //matlab一列一列地写 } mwArray a(NUM,NUM,mxDOUBLE_CLASS);//a用于存储待计算矩阵,在matlab语言中从a(1,1)开始计数 for(int i=1;i<=NUM;i++) for(int j=1;j<=NUM;j++) a(i,j) = xx[i-1][j-1]; mwArray y(NUM,NUM,mxDOUBLE_CLASS);//y用于输出最后得到的矩阵 mwArray n(1,1,mxINT32_CLASS); //n是一个一维矩阵,存储NUM值 n(1,1) = NUM; inverse(1,y,a,n); for(int i=0;i<NUM;i++) { for(int j=0;j<NUM;j++) { cout<<y(i+1,j+1)<<' '; } cout<<endl; } libinverseTerminate(); //关闭库和程序 mclTerminateApplication(); delete[] x; delete[] xx[0]; delete[] xx; } 编译运行就可以了。 |
联系客服