?? vc++中使用matlab的c++數學庫和mcc生成的程序.txt
字號:
發信人: energy (長白山), 信區: MathTools
標 題: VC++中使用MATLAB的C++數學庫和MCC生成的程序
發信站: BBS 水木清華站 (Fri Jul 16 01:30:11 1999)
http://obase.163.net/matlab/vcmcc.htm
VC++中使用MATLAB的C++數學庫和MCC生成的程序
0、簡介
MATLAB5.3的提供了C/C++數學庫,其中的C++數學庫功能很強,使用它可以用類似
MATLAB的語法編寫C++程序,十分方便。雖然速度上仍然比手工C/C++程序慢,但是由此
換來的高效的開發效率和可靠性往往是值得的。另外mcc命令可以將M文件轉化為C或CPP
文件,編譯后可以脫離MATLAB運行,它們也是使用的C/C++數學庫。
不過,MATLAB的數學庫在開發時似乎傾向于編譯獨立的可執行程序,把VC、BC只是作
為一個編譯和連接的工具,而沒有過多地考慮在VC、BC的集成環境下進行開發。這給我們
帶來了不便。
很多網友問起如何將MCC生成的C++程序嵌入到VC。最近對這個問題做了一下嘗試,在
這里做一個總結,請大家回去試試。這里只介紹VC的情況,用BC的網友就自己研究研究吧,
估計是類似的。
1、設置項目編譯選項
首先建立一個新的項目,或者打開一個已有的項目,然后選擇菜單:
Project->Settings->C/C++
Category:Preprocessor
Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND
Category: Precompiled Headers
選擇: Automatic use of precompiled headers
Through header: stdafx.h
2、調設置項目連接選項
首先要從下面幾個函數定義文件(*.def)生成相應的導入庫文件(*.lib)
libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def
它們位于目錄c:\matlab\extern\include
用下面命令導出庫文件:
lib /def:libmmfile.def /out:libmmfile.lib /machine:ix86
lib /def:libmcc.def /out:libmcc.lib /machine:ix86
lib /def:libmatlb.def /out:libmatlb.lib /machine:ix86
lib /def:libmx.def /out:libmx.lib /machine:ix86
lib /def:libmat.def /out:libmat.lib /machine:ix86
將它們放入你的項目連接選項
Project->Settings->Link
Category:Input
Object/library modules:
添加:libmatpm.lib libmmfile.lib libmcc.lib libmatlb.lib libmx.lib libmat.lib
注1: 中間是空格,不要加逗號
注2: libmatpm.lib是C++ MathLib的庫,如果是只用C,就不用連接它了。
Ignore libraries:
添加: msvcrt.lib
注: 僅在Debug版本中需要。原因不明:P)
以上的這些lib文件,我已經做好了,打了個包放在這里下載:matlablibs.zip (64K)
3、設置編譯環境
Tools->Options->Directories
Include fiels添加:
c:\matlab\extern\include
c:\matlab\extern\include\cpp
Library fiels添加:
c:\matlab\extern\lib
c:\matlab\extern\include
注:下面這個目錄是那些lib所在的地方。
如果都挪到上面的目錄,這個自然就不要了。
4、編寫程序
用MCC命令生成的CPP文件和自己手工編寫的CPP文件, 其項目設置是完全相同的,
程序的語法原則上也是一樣的. 只是MCC生成的CPP文件有大量"沒用"的代碼.
(1)添加自己編寫的程序模塊
用下面文件頭:
#include "stdafx.h"
#include "matlab.hpp"
然后, 按照C++ MathLib文檔要求的格式書寫程序.
(2)嵌入mcc生成的文件
在MATLAB下用下面格式的命令生成cpp文件
mcc -t -L Cpp test
得到test.hpp, test.cpp
將test.cpp加入項目, 不做任何改動.
最后,按F7編譯就可以了。
5、實例
上面羅羅嗦嗦一大堆,肯定讓你打哈欠了:P)
沒關系,其實還是挺簡單的,這里有個VC的project,用C++數學庫解決了一個幼兒園的算
術題,下載回去看看吧,馬上就明白了。
MccDemo.zip (68K)
這里先說明一下:
MATLAB程序test.m:
function [sum, prod]=test(x,y)
sum = x+y;
prod = x*y;
用來計算兩個數的和與積。注意這是兩個返回變量的情況。
另外,x,y當然可以是數組。
用mcc命令生成了test.hpp和test.cpp。
文件demo.cpp:
#include "stdafx.h"
#include "matlab.hpp"
#include "test.hpp"
void mccDemo()
{
CString str;
mwArray x, y, sum, prod;
double dx,dy,dsum,dprod;
x = 5.0;
y = 10.0;
sum = test(&prod, x, y);
dx=x(1,1);
dy=y(1,1);
dsum=sum(1,1);
dprod=prod(1,1);
str.Format("%f+%f=%f\n%f*%f=%f", dx,dy,dsum,dx,dy,dprod);
AfxMessageBox(str);
}
由于采用了C++數學庫,語法很簡單。注意數組的賦值、其中數據的存取,這些都要仔細
地看手冊。
最后是跳出一個消息框,顯示計算結果。
改程序啟動之后,選擇菜單mcc->demo即可。
1. 目的
一般情況下,我們都是在MATLAB命令行或DOS命令行下編譯MEX程序。
所用的命令就是:mex filename.c
這有很多不方便的地方:
a. 雖然mex也可以編譯C++的mex程序,但是它的主框架仍是C的
b. 當程序有多個模塊時,需要多次使用mex命令,操作很麻煩
c. 不能利用VC特有的ClassWizard自動創建和維護類
d. 不能用MFC類庫編寫應用程序
e. 不能方便地進行類似VC的項目管理
f. 等等...
這樣一個命令行的編程環境可能會大大束縛你的想象力...
其實解決問題的方法很簡單,下面以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:REF
LINK : warning LNK4089: all references to "comdlg32.dll" discarded by /OPT:REF
MatWave.dll - 0 error(s), 2 warning(s)
大功告成,有兩個警告,不理它。
拿到MATLAB里面試試吧,不過要有非法操作和異常退出的心理準備哦:P
另外:如果要在MATLAB運行中重新編譯DLL,需先執行: clear mex
ICQ : 6821977
Email: obase@163.net
WWW : http://obase.163.net
Matcom
第一章、概述
第二章、在Matlab中使用mex和mcc(作者dodoo,energy)
2.1 用c編寫mex程序[1]--dodoo
2.2 用c編寫mex程序[2]--dodoo
2.3 用c編寫mex程序[3]--dodoo
2.4 用c編寫mex程序[4]--dodoo
2.5 用c編寫mex程序[5]--dodoo
2.6 用c編寫mex程序[6]--dodoo
2.7 VC++中使用MATLAB的C++數學庫和MCC生成的程序--energy
第三章、Matcom的使用
3.1 概述
3.1.1 Matcom能作什么
3.1.2 Matcom的工作原理
3.1.3 Matcom的不足
3.1.4 Matcom下載地址及網絡資源
3.2 版本及安裝注意事項
3.2.1 MIDEVA 4.0 的安裝
3.2.2 MIDEVA 4.5 的安裝
3.3 用Matcom翻譯m文件
3.4 如何得到CPP源文件
3.5 在CB中C++與Matlab語言混編
3.6 程序的發布
附錄一、Matcom的函數分類列表
第一章、概述
Matlab是當今世界上使用最為廣泛的數學軟件,它具有相當強大的數值計算、
數據處理、系統分析、圖形顯示,甚至符號運算功能,是一個完整的數學平
臺,在這個平臺上,你只需寥寥數語就可以完成十分復雜的功能,大大提高了
工程分析計算的效率。另外由于Matlab的廣泛使用,于是出現了為各個領域專
門使用的工具箱(即在某一研究領域常用數學工具的函數包),這些工具箱的出現
更加促進了Matlab的流行。
Matlab強大的功能只能在它所提供的平臺上才能使用,也就是說,你必需在
安裝有matlab系統的機器上使用.m文件,這樣就給工程計算帶來了很大不便;特
別是,在matlab中,使用的行解釋方式執行代碼,這樣大大地限制了代碼執行速度。
于是人們想到,能否開發一個matlab與其他高級語言的接口,這樣就可以把matlab
的強大功能融入各種應用程序中,并且通過高級語言編譯器編譯為2進制代碼,
從而大大提高了執行速度。
于是matlab的5.1版本提供了自帶的C++ Complier,同時MathTools公司也為
Matlab開發了m文件高效解釋和調試IDE:MIDEVA。經過近兩年的發展,matlab 5.3
中的C complier--mcc版本已經為2.0,而MIDEVA最新版本為4.5。
將matlab與C混合編程大概有如下三種方法:
1.用Matlab的mcc將.m文件翻譯為cpp源文件,然后在C編譯器中調用
也可以用mcc編譯編譯為stand-alone程序。
2.用Matcom(MIDEVA)將.m文件翻譯為cpp代碼,并編譯為exe或dll
文件。
3.按照matcom的語法,在VC或BCB中直接書寫matlab語句(與matlab
很相似),這也是我最喜歡用的方法。
方法1和2/3各有利弊,1不支持圖形(支持圖形的庫國內現在還沒有D),
1對類支持也不夠,2支持絕大多數的matlab語句(包括圖形),但對
于struct等的支持也有缺陷。
http://obase.163.net/matlab/vcmcc.htm
VC++中使用MATLAB的C++數學庫和MCC生成的程序
0、簡介
MATLAB5.3的提供了C/C++數學庫,其中的C++數學庫功能很強,使用它可以用類
似MATLAB的語法編寫C++程序,十分方便。雖然速度上仍然比手工C/C++程序慢,但是
由此換來的高效的開發效率和可靠性往往是值得的。另外mcc命令可以將M文件轉化
為C或CPP文件,編譯后可以脫離MATLAB運行,它們也是使用的C/C++數學庫。
不過,MATLAB的數學庫在開發時似乎傾向于編譯獨立的可執行程序,把VC、BC只
是作為一個編譯和連接的工具,而沒有過多地考慮在VC、BC的集成環境下進行開發。
這給我們帶來了不便。
很多網友問起如何將MCC生成的C++程序嵌入到VC。最近對這個問題做了一下嘗試,
在這里做一個總結,請大家回去試試。這里只介紹VC的情況,用BC的網友就自己研究
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -