精通VC與MATLAB聯合編程<八>——編譯器的使用
作者:鄧科
下載源代碼
淺析VC與MATLAB聯合編程<一>
淺析VC與MATLAB聯合編程<二>
淺析VC與MATLAB聯合編程<三>
淺析VC與MATLAB聯合編程<四>
精通VC與MATLAB聯合編程<五>
精通VC與MATLAB聯合編程<六>
精通VC與MATLAB聯合編程<七>
在上一章中對MATLAB 編譯器做了簡要介紹,並介紹瞭如何將m文件轉換成VC可調用的dll文件,在這章中介紹如何利用編譯器將m文件轉換成對應的C/C++文件,並在VC中調用。這章節中的例子是在第四章中介紹過的解線形方程組。
首先要保證編譯器設置正確,編譯器的設置可以參考前面兩章的內容。如果以前已經進行了配置就不需要這一步。
1、在MATLAB中編寫如下函數:
function [x]=gjfcz(A,b) %A=[-1.5 1 2; 4 2 3 ; -3 2 8] %b=[3;5;6] x=A/b保存名爲gjfcz.m,該函數的功能爲求解線形方程組,可參考第四章的內容。
2、在MATLAB的命令窗口輸入以下命令:
mcc –m gjfcz.m
該命令用來生成對應的C文件和可執行程序。在MATLAB工作目錄下(一般是MATLAB/work)將會生成如下文件:gjfcz.exe,gjfcz.c,gjfcz.h,gjfcz_main.c,其中gjfcz.c,gjfcz.h是我們需要的文件。
3、新建名爲JXXFC基於對話框的工程,面板上添加一個按扭。
4、拷貝gjfcz.c,gjfcz.h兩文件到工程目錄下,並將文件引入工程(Project->Add to Project->Files)。
5、爲按扭添加如下響應代碼:
void CJXXFCDlg::OnButton1() { static double Adata[]={-1.5,4,-3,1,2,2,2,3,8}; static double bdata[]={3,5,6}; double Xdata[100]; mxArray *A = NULL;//賦初值 mxArray *b = NULL; mxArray *x = NULL; /* 使用自動內存管理*/ mlfEnterNewContext(0, 0); //創建矩陣 mlfAssign(&A, mlfDoubleMatrix(3, 3, Adata, NULL)); mlfAssign(&b, mlfDoubleMatrix(3, 1, bdata, NULL)); InitializeModule_gjfcz(); x=mlfGjfcz(A,b);//調用gjfcz.c中的函數求解 TerminateModule_gjfcz(); memcpy(Xdata,mxGetPr(x),3*sizeof(double)); // mxGetPr(x)用來得到x的地址 CString R; R.Format("%f/n%f/n%f",Xdata[0],Xdata[1],Xdata[2]); MessageBox(R); /* 釋放矩陣所佔的內存*/ mxDestroyArray(A); mxDestroyArray(b); mxDestroyArray(x); /* 禁用自動內存管理*/ mlfRestorePreviousContext(0, 0); }編譯、連接,運行結果如圖1:
圖1
本程序在VC6.0+MATLAB6.5環境下調式通過,在VC和MATLAB接口編程中,使用編譯器將m文件編譯成C/C++文件,然後在VC中調用該C/C++文件是最常用的方法。 本例中雖然使用了C/C++函數庫中的函數,但比起完全使用C/C++函數編寫程序要簡單了許多,可見要靈活的使用編譯器,對C/C++函數庫有一定的瞭解是很必要的,MATLAB提供有函數庫的幫助文檔cmath_ref2b.pdf和cmath_ug2b.pdf,使用的時候可以查閱。再次說明的是,很多朋友已經在使用MATLAB7.0的版本,7.0的版本在對C/C++接口技術上做了很大改動,不是一般的升級,對以前的版本也不兼容。新的版本提供了一個類似於VC的類庫,用了一下,感覺不是很好。