程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 精通VC與MATLAB聯合編程(八)

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

編輯:關於VC++

在上一章中對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的類庫,用了一下,感覺不是很好。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved