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