1. 程式人生 > >Matlab 混合程式設計資源1

Matlab 混合程式設計資源1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

發信人: roy (中國大兵), 信區: Matlab

  : VC++ 中編譯 MEX 程式(zz)

發信站: 紅果園 (2003103011:58:08 星期四

), 站內信件

 

VC++ 中編譯 MEX 程式

1. 目的

  一般情況下,我們都是在MATLAB命令列或DOS命令列下編譯MEX程式。 所用的命令就是

mex filename.c 這有很多不方便的地方:

  a. 雖然mex也可以編譯C++mex程式,但是它的主框架仍是C a. 當程式有多個模組

時,需要多次使用mex命令,操作很麻煩

  b. 不能利用VC特有的ClassWizard自動建立和維護類

  c. 不能用MFC類庫編寫應用程式

  d. 不能方便地進行類似

VC的專案管理

這樣一個命令列的程式設計環境可能會大大束縛你的想象力... 其實解決問題的方法很簡單

,下面以VC6環境為例詳細解說如何在IDE中編譯MEX程式。

2. 步驟

(1)準備工作 (這裡假設MATLAB的路徑為:C:/MATLAB)

a. matlab.def建立庫檔案matlab.lib

進入c:/matlab/extern/include目錄,用lib命令生成matlib.lib

  C:/>cd /matlab/extern/include

  C:/MATLAB/extern/include>lib /def:matlab.def /out:matlab.lib

  Microsoft (R) Library Manager Version 6.00.8447

  Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

  LIB : warning LNK4068: /MACHINE not specified; defaulting to IX86

  Creating library matlab.lib and object matlab.exp

  C:/MATLAB/extern/include>

  警告資訊不用理它。

b. 修改mex.h

該檔案也在C:/MATLAB/extern/include目錄

找到這一行:void mexFunction(

替換為 __declspec( dllexport ) void mexFunction(

另儲存為 mex_vc.h

(2)啟動VC,建立MFC AppWizard(dll)程式框架

(3)設定系統選項

a. 設定標頭檔案和庫檔案路徑

選單Tools->Options->Directories

Include files:新增c:/matlab/extern/include

Library files:新增c:/matlab/extern/include

b. 設定編譯連線選項

選單Project->Settings

C/C++->Preprocessor definitions: 新增MATLAB_MEX_FILE

Link->Object/Library modules: 新增matlab.lib

1. 其它優化、除錯以及標頭檔案、庫檔案等選項看情況調整

2. Release版在General->Microsoft Foundation Classes選項中, 必須設定為Use

MFC in a Static Library. 原因不明 (4)編寫DLL主程式

a. 檔名要用.cpp為副檔名,頭兩行必須是:

#include "stdafx.h"

#include "mex_vc.h"

b. 編寫mexFunction函式,用如下格式宣告:

void mexFunction(

int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[])

{

...

}

(5) 象普通VCDLL程式一樣繼續編寫其它部分程式,加入其它模組

(6) 除錯錯誤,用F7編譯,生成DLL。我的例子:

--------------------Configuration: MatWave - Win32 Release------------------

--

Compiling resources...

Compiling...

StdAfx.cpp

Compiling...

MatWave.cpp

sample.cpp

mex.cpp

Generating Code...

Linking...

Creating library Release/MatWave.lib and object Release/MatWave.exp

LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:RE

F

LINK : warning LNK4089: all references to "comdlg32.dll" discarded by /OPT:R

EF

MatWave.dll - 0 error(s), 2 warning(s)

大功告成,有兩個警告,不理它。 拿到MATLAB裡面試試吧,不過要有非法操作和異常退

出的心理準備哦.

另外:如果要在MATLAB執行中重新編譯DLL,需先執行: clear mex

////////////////////////////////////////////////////////////////////////////////

MATLAB中可呼叫的CFortran語言程式稱為MEX檔案。MATLAB可以直接把MEX檔案視為它的內建函式進行呼叫。MEX檔案是動態連結的子例程,MATLAB直譯器可以自動載入並執行它。MEX檔案主要有以下用途:

    對於大量現有的C或者Fortran程式可以無須改寫成MATLAB專用的M檔案格式而在MATLAB中執行。

////////////////////////////////////////////////////////////////////////////////

 

發信人: roy (中國大兵), 信區: Matlab

  : vc中呼叫matlab的方法

發信站: 紅果園 (2003110914:53:14 星期天), 站內信件

 

Matlab提供了多種與C/C++混合程式設計的方式

目前實現的有以下一些。

 1. COM元件程式設計。

 Matlab中,呼叫comtool工具,把.m檔案編譯成標準COM元件。

 這種方式是Matlab主推的方式。

 2. VC中的Matlab Addin,嚮導將.m檔案直接編譯成可執行檔案。

 這也是比較標準的做法。在實驗中,沒有遇到任何問題。

 這種方法存在的問題是:生成的C語言程式碼基本不能改動,無法加入自己的程式碼。

 如果不呼叫圖形介面,可以加入自己的程式碼。

 例如:其生成的主程式一般為

 int main(int argc, const char * * argv) {

      return mclMain(argc, argv, mlxReadd, 0, &_main_info);

 }

 不要呼叫mclMain函式,而是呼叫它帶有原始介面的函式

 void mlxReadd(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[])

 通常可以。不過這樣略去了一些初始化的過程。具體可以參考Matlab幫助。

 自動生成的主程式做了如下工作。

  1. Defines persistent/global variables

  2. Initializes the feval function table for run-time feval support

  3. Performs wrapper-specific initialization and termination

  4. Initializes the constant pools generated by optimization

 我要實現的是下面這種,我覺得最簡單,適合編寫控制檯程式。

 3. 直接寫主程式,然後通過Matlab中編譯的庫機制,實現程式的混編。

 由於Matlab不提倡這種呼叫,在v6.5版中,沒有這部分的幫助。參考Matlab6.1中的

Compiler

 手冊的Mixing M-Files and C or C++ P110

 主程式的寫法的例子為:main.c

 #include