VC和Matlab混編,最常用的就是用前者編寫界面EXE,後者編寫算法DLL。特別是在後者擅長的領域,如數學、仿真等顯得特別有意義。
先說DLL生成。有下面一個m文件,實現加法功能,c=a+b,代碼如下:
function [c]=abc(a,b)
c=a+b
設文件名爲abc.m。在Matlab中加載此文件後,執行,選擇“Change Folder”,這樣執行各命令時會容易找到路徑。在命令行中輸入下面命令進行編譯:
mcc -B csharedlib:AbcLib abc.m
簡單解釋一下,mcc是編譯命令,大概是Matlb-C-Compiler的首字母縮寫;-B表示捆綁(Bound)參數,mcc的參數很多,有些編譯的參數是常用的,不妨編寫成一個集合,如這裏的csharedlib,字面理解就是C共享庫。AbcLib是最終生成的庫名,abc.m是m文件名。
編譯執行完成後,在m文件的同目錄下會出現很多文件,這裏基本用到的就是.h文件,.c文件,lib文件,dll文件。用VC自帶的Depends工具查看DLL,會發現導出函數自動加上了mlf前綴,如此處的mlfAbc。
新建VC工程,Win32, Console還是MFC任意。文件中加入下面兩行:
#include "AbcLib.h"
#pragma comment(lib,"AbcLib.lib")
這裏必須要注意,這兩句請放得靠前一些,例如文件最上部。如果它們被放在最下面,往往會出現錯誤(是IFDEF、ELSE之類的宏產生了錯亂)。另外需要包含的頭文件還有:#include "mclmcr.h" 、 #include "matrix.h"。
當然了,要把.h文件和.c文件加入工程。
調用之前,需初始化一下,可以在InitInstance裏或Dialog的Initialize裏面,如下:
if(!AbcLibInitialize())
{
AfxMessageBox("初始化失敗!");
return TRUE;
}
結束時還要來一個終止:
AbcLibTerminate();
這兩個函數都是DLL中自動生成的,直接調 用即可。
以上,都是準備工作,下面調用Abc即DLL中的mlfAbc函數進行加法運算:
double a[1],b[1];
a[0] = 4;
b[0] = 11;
mxArray *x = mxCreateDoubleMatrix(1,1, mxREAL);
mxArray *y = mxCreateDoubleMatrix(1,1, mxREAL);
//mxDestroyArray(x); //銷燬mxArray數組x和y。
//mxDestroyArray(y);
memcpy(mxGetPr(x), a, 1*sizeof(double)); //將數組x複製到mxarray數組xx中。
memcpy(mxGetPr(y), b, 1*sizeof(double)); //將數組x複製到mxarray數組yy中。
mxArray * pArrayOut;
pArrayOut = NULL;
mlfAbc(1,&pArrayOut,x,y);
CString s;
s.Format("%f",*(mxGetPr(pArrayOut)));
AfxMessageBox(s);
解釋一下。Matlab中並未具體定義數據類型,像C++中的int, char, long,在Matlab中統統沒有,Matlab中所有數據類型都是矩陣(數組),哪怕是一個數,也要看成是一個1X1的數組,double型。這裏,用a[0]和b[0]來構造兩個輸入參數。用mxArray *類型來接收轉換後的地址,這樣Matlab纔會認識。
加法演示完啦,明年再寫第二課……。