Matlab 混合程式設計資源1
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
發信人: roy (中國大兵), 信區: Matlab
標 題: VC++ 中編譯 MEX 程式(zz)
發信站: 紅果園 (2003年10月30日11:58:08 星期四
VC++ 中編譯 MEX 程式
1. 目的
一般情況下,我們都是在MATLAB命令列或DOS命令列下編譯MEX程式。 所用的命令就是
:mex filename.c 這有很多不方便的地方:
a. 雖然mex也可以編譯C++的mex程式,但是它的主框架仍是C的 a. 當程式有多個模組
時,需要多次使用mex命令,操作很麻煩
b. 不能利用VC特有的ClassWizard自動建立和維護類
c. 不能用MFC類庫編寫應用程式
d. 不能方便地進行類似
這樣一個命令列的程式設計環境可能會大大束縛你的想象力... 其實解決問題的方法很簡單
,下面以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) 象普通VC的DLL程式一樣繼續編寫其它部分程式,加入其它模組
(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中可呼叫的C或Fortran語言程式稱為MEX檔案。MATLAB可以直接把MEX檔案視為它的內建函式進行呼叫。MEX檔案是動態連結的子例程,MATLAB直譯器可以自動載入並執行它。MEX檔案主要有以下用途:
對於大量現有的C或者Fortran程式可以無須改寫成MATLAB專用的M檔案格式而在MATLAB中執行。
////////////////////////////////////////////////////////////////////////////////
發信人: roy (中國大兵), 信區: Matlab
標 題: 在vc中呼叫matlab的方法
發信站: 紅果園 (2003年11月09日14: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