從Matlab 2008開始才能支持VS2008,所以這里寫一個例子介紹如何將二者結(jié)合,生成 .dll文件進行混合編程。
首先,為matlab安裝mex和mbuild并配置好環(huán)境變量。
下面給出一個具體的實例進行講解:
在matlab中寫一個簡單的inverse.m實現(xiàn)求矩陣的逆:
function y=inverse(a,NUM)
%NUM 是a的維數(shù),這里沒有什么實際意義
y=inv(a);
針對上面的例子創(chuàng)建狀態(tài)鏈接庫(在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,使其調(diào)用這個.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, 把相應(yīng)的lib所在目錄加入。
打開project->Test_matlab_properties->Linker->Input->Addational Dependencies 把.lib 與mclmcrrt.lib加入,中間用空格。
最后,把.h添加到VC++程序中,其主程序如下(請轉(zhuǎn)II):
注意2:有可能出現(xiàn)'mclInitializeApplication_proxy': identifier not found,錯誤
這是因為頭文件的相對位置不對,把調(diào)用matlab的driver頭文件放在#include "mclcppclass.h"的前邊或者不用#include "mclcppclass.h",因為它就包含在調(diào)用matlab的driver頭文件中。
// Test_matlab.cpp : Defines the entry point for the console application.
//程序中包括我做的一些其它的測試,例如內(nèi)存的寫順序,如何傳遞參數(shù)等等問題
//程序功能:VC++調(diào)用matlab中的inv函數(shù),實現(xiàn)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)開始計數(shù)
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(); //關(guān)閉庫和程序
mclTerminateApplication();
delete[] x;
delete[] xx[0];
delete[] xx;
}
編譯運行就可以了。