Matcom是Mathworks公司推出的第一個由Matlab到C++的編譯開發軟件平台,它的可視化界面,方便豐富的調試功能和對數學庫的強大支持受到廣大技術人員的重視。現在的最高版本為Matcom4.5。
我們可以通過在Matcom中file菜單下的compile to exe or dll調用.m文件編譯,在Matcom的debug目錄下找到生成的cpp、exe、dll文件。把需要的文件加到VC開發環境的工程中,再包含頭文件就可以實現調用。也可以直接在VC環境下使用科學運算庫,即Matcom的Matrix,它是按照Matcom的語法在VC中實現類似於Matlab函數的方法。但是這裡還有一種將Matcom集成到VC環境的方法,即安裝Visual Matcom的方式,這種方式操作更加簡便易行,只需要熟悉Matlab編程,經過簡單的步驟就可以輕松實現VC環境中調用Matlab。下面介紹Visual Matcom開發環境的安裝。
(1)拷貝inusertype.dat文件(指Matcom的安裝路徑)到CommonMSDev98Bin目錄(指VC的安裝路徑)下。
(2)運行Visual C++,從菜單條中選擇Tools/Customize/Add-ins and Macro Files,選擇Browse,改變文件類型為Add-ins(.dll),選定inmvcide.dll文件,確定。
(3)這樣,可以在Visual C++的開發環境中看到一個如圖1所示的Visual Matcom工具欄,表明安裝成功。
下面以一個線性方程組的求解過程為例,介紹通過Matcom實現VC對Matlab程序的調用,運行環境:Win2000、Matlab6.1、Matcom4.5、Visual C++6.0 (1)Matlab運行環境中編寫程序equation.m,其代碼如下:
%equation 求解線性方程組的解%線性方程組形如:A*X = Bfunction X = equation(A, B)X = AB;
(2)這裡以一個簡單的控制台程序為例,其它程序基本相同。在VC環境中建立一個名為Test的Win32 Console Application工程。 (3)點擊Visual Matcom工具欄上的m++圖標,選擇保存過的Matlab文件equation.m進行轉化。如果看到的轉化信息提示沒有錯誤就可以觀察到此時在FileVIEw標簽中多了m-files,C++files created from m-files,Matrix等文件。並且該工程目錄下增加了equation.h,equation.cpp,equation.mak,equation.r等的4個文件。這時會在VC中出現一個轉換完畢的文件,文件中如果報告有錯誤就要考慮是否程序有問題,可以雙擊C++files文件夾下的equation.m進行修改,再重新轉化直到沒有錯誤報告為止。 (4)在Test工程下建立一個文件test.cpp調用轉化的Matlab函數,代碼為:
#include "stdio.h" #include "matlib.h" //提供轉化後C++代碼中使用的數據類型,函//數原型及常數#include "equation.h" void main(){ /*解線性方程組: X = */ initM(MATCOM_VERSION); //初始化matlib庫 Mm a,b,x; //使用矩陣類Mm構造矩陣a,b,x. a = (BR(1),2,3,semi,4,5,6,semi,7,8,1); //給矩陣a賦值,BR是Matrix庫的一個 //宏,用於定義一個矩陣的開始;semi是庫的//一個常量,用於分隔不同行的矩陣元素 b = zeros(3,1); //初始化矩陣b為零矩陣3行1列 b(1,1) = 37; b(2,1) = 85; b(3,1) = 69; //給矩陣b賦值 x = equation(a,b); //調用轉化的函數,求解線性方程組的解 for (int i = 1; i <= x.rows(); i++) //把解矩陣X的元素顯示出來 { for (int j=1;j<=x.cols();j++) printf("x(%d,%d)=%f ",i,j,x.r(i,j)); } exitM(); //結束對matlib庫的調用 return;}
注意:程序中涉及到了兩個成員函數.rows()和.cols(),它們分別返回矩陣的行數和列數;x.r(i,j)代表矩陣x的第i行第j列的元素。 (5)編譯運行後結果為x(1,1) = 3.000000 x(2,1) = 5.000000 x(3,1) = 8.000000與實際結果一致。 總結:如果需要轉換的.m文件不是一個函數,只是一些Matlab命令的集合,則要在工程目錄下找到轉換文件的.cpp文件,將其中的C代碼拷貝到需要調用它的函數裡面。Matcom克服了mcc命令只能編譯一個獨立.m文件的缺點,當所編譯的.m文件依賴於其他.m文件時,只要把被調用的.m文件與要編譯的.m文件放在同一目錄下,生成的被調用文件的.h和.cpp文件插入到VC開發的工程中就可以了。 上面只是一個簡單的控制台工程的例子,我們也可以建立其它類型的工程,只要在需要調用轉換後函數的程序中包含matlib.h並且在響應函數中初始化matlib庫initM(MATCOM_VERSION);結束調用後做結束工作exitM();就可以了。