VC和Matlab混編第一課

  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纔會認識。

  加法演示完啦,明年再寫第二課……。

發佈了57 篇原創文章 · 獲贊 31 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章