精通VC與MATLAB聯合編程(八)

精通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的類庫,用了一下,感覺不是很好。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章