Matlab與C++接口與混合編程討論小結(jié)教學(xué)文案_第1頁
Matlab與C++接口與混合編程討論小結(jié)教學(xué)文案_第2頁
Matlab與C++接口與混合編程討論小結(jié)教學(xué)文案_第3頁
Matlab與C++接口與混合編程討論小結(jié)教學(xué)文案_第4頁
Matlab與C++接口與混合編程討論小結(jié)教學(xué)文案_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Matlab與C+接口與混合編程討論小結(jié)Matlab與C+接口與混合編程討論小結(jié)目錄第一章、概述第二章、在Matlab中使用mex和mcc(作者dodoo,energy)2.1用c編寫mex程序1-dodoo2.2用c編寫mex程序2-dodoo2.3用c編寫mex程序3-dodoo2.4用c編寫mex程序4-dodoo2.5用c編寫mex程序5-dodoo2.6用c編寫mex程序6-dodoo2.7VC+中使用MATLAB的C+數(shù)學(xué)庫和MCC生成的程序-energy第三章、Matcom的使用3.1概述

2、3.1.1Matcom能作什么3.1.2Matcom的工作原理3.1.3Matcom的不足3.1.4Matcom下載地址及網(wǎng)絡(luò)資源3.2版本及安裝注意事項3.2.1MIDEVA4.0的安裝3.2.2MIDEVA4.5的安裝3.3用Matcom翻譯m文件3.4如何得到CPP源文件3.5在CB中C+與Matlab語言混編3.6程序的發(fā)布附錄一、Matcom的函數(shù)分類列表-第一章、概述Matlab是當(dāng)今世界上使用最為廣泛的數(shù)學(xué)軟件,它具有相當(dāng)強大的數(shù)值計算、數(shù)據(jù)處理、系統(tǒng)分析、圖形顯示,甚至符號運算功能,是一個完整的數(shù)學(xué)平臺,在這個平臺上,你只需寥寥數(shù)語就可以完成十分復(fù)雜的功能,大大提高了工程分析計

3、算的效率。另外由于Matlab的廣泛使用,于是出現(xiàn)了為各個領(lǐng)域?qū)iT使用的工具箱(即在某一研究領(lǐng)域常用數(shù)學(xué)工具的函數(shù)包),這些工具箱的出現(xiàn)更加促進(jìn)了Matlab的流行。Matlab強大的功能只能在它所提供的平臺上才能使用,也就是說,你必需在安裝有matlab系統(tǒng)的機器上使用.m文件,這樣就給工程計算帶來了很大不便;特別是,在matlab中,使用的行解釋方式執(zhí)行代碼,這樣大大地限制了代碼執(zhí)行速度。于是人們想到,能否開發(fā)一個matlab與其他高級語言的接口,這樣就可以把matlab的強大功能融入各種應(yīng)用程序中,并且通過高級語言編譯器編譯為2進(jìn)制代碼,從而大大提高了執(zhí)行速度。于是matlab的5.1版

4、本提供了自帶的C+Complier,同時MathTools公司也為Matlab開發(fā)了m文件高效解釋和調(diào)試IDE:MIDEVA。經(jīng)過近兩年的發(fā)展,matlab5.3中的Ccomplier-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的語法,在VC或BCB中直接書寫matlab語句(與matlab很相似),

5、這也是我最喜歡用的方法。方法1和2/3各有利弊,1不支持圖形(支持圖形的庫國內(nèi)現(xiàn)在還沒有D),1對類支持也不夠,2支持絕大多數(shù)的matlab語句(包括圖形),但對于struct等的支持也有缺陷。-Matlab與C+接口與混合編程討論小結(jié)(二)VC+中使用MATLAB的C+數(shù)學(xué)庫和MCC生成的程序0、簡介MATLAB5.3的提供了C/C+數(shù)學(xué)庫,其中的C+數(shù)學(xué)庫功能很強,使用它可以用類似MATLAB的語法編寫C+程序,十分方便。雖然速度上仍然比手工C/C+程序慢,但是由此換來的高效的開發(fā)效率和可靠性往往是值得的。另外mcc命令可以將M文件轉(zhuǎn)化為C或CPP文件,編譯后可以脫離MATLAB運行,它們

6、也是使用的C/C+數(shù)學(xué)庫。不過,MATLAB的數(shù)學(xué)庫在開發(fā)時似乎傾向于編譯獨立的可執(zhí)行程序,把VC、BC只是作為一個編譯和連接的工具,而沒有過多地考慮在VC、BC的集成環(huán)境下進(jìn)行開發(fā)。這給我們帶來了不便。很多網(wǎng)友問起如何將MCC生成的C+程序嵌入到VC。最近對這個問題做了一下嘗試,在這里做一個總結(jié),請大家回去試試。這里只介紹VC的情況,用BC的網(wǎng)友就自己研究研究吧,估計是類似的。1、設(shè)置項目編譯選項首先建立一個新的項目,或者打開一個已有的項目,然后選擇菜單:Project-Settings-C/C+Category:PreprocessorPreprocessordefinitions:添加:

7、MSVC,IBMPC,NDCategory:PrecompiledHeaders選擇:AutomaticuseofprecompiledheadersThroughheader:stdafx.h2、調(diào)設(shè)置項目連接選項首先要從下面幾個函數(shù)定義文件(*.def)生成相應(yīng)的導(dǎo)入庫文件(*.lib)libmmfile.deflibmcc.deflibmatlb.deflibmx.deflibmat.def它們位于目錄c:matlabexterninclude用下面命令導(dǎo)出庫文件:lib/def:libmmfile.def/out:libmmfile.lib/machine:ix86lib/def:li

8、bmcc.def/out:libmcc.lib/machine:ix86lib/def:libmatlb.def/out:libmatlb.lib/machine:ix86lib/def:libmx.def/out:libmx.lib/machine:ix86lib/def:libmat.def/out:libmat.lib/machine:ix86將它們放入你的項目連接選項Project-Settings-LinkCategory:InputObject/librarymodules:添加:libmatpm.liblibmmfile.liblibmcc.liblibmatlb.liblibm

9、x.liblibmat.lib注1:中間是空格,不要加逗號注2:libmatpm.lib是C+MathLib的庫,如果是只用C,就不用連接它了。Ignorelibraries:添加:msvcrt.lib注:僅在Debug版本中需要。原因不明:P以上的這些lib文件,我已經(jīng)做好了,打了個包放在這里下載:matlablibs.zip(64K)3、設(shè)置編譯環(huán)境Tools-Options-DirectoriesIncludefiels添加:c:matlabexternincludec:matlabexternincludecppLibraryfiels添加:c:matlabexternlibc:mat

10、labexterninclude注:下面這個目錄是那些lib所在的地方。如果都挪到上面的目錄,這個自然就不要了。4、編寫程序用MCC命令生成的CPP文件和自己手工編寫的CPP文件,其項目設(shè)置是完全相同的,程序的語法原則上也是一樣的.只是MCC生成的CPP文件有大量沒用的代碼.(1)添加自己編寫的程序模塊用下面文件頭:#includestdafx.h#includematlab.hpp然后,按照C+MathLib文檔要求的格式書寫程序.(2)嵌入mcc生成的文件在MATLAB下用下面格式的命令生成cpp文件mcc-t-LCpptest得到test.hpp,test.cpp將test.cpp加入項

11、目,不做任何改動.最后,摁F7編譯就可以了。5、實例上面羅羅嗦嗦一大堆,肯定讓你打哈欠了:P沒關(guān)系,其實還是挺簡單的,這里有個VC的project,用C+數(shù)學(xué)庫解決了一個幼兒園的算術(shù)題,下載回去看看吧,馬上就明白了。MccDemo.zip(68K)這里先說明一下:MATLAB程序test.m:functionsum,prod=test(x,y)sum=x+y;prod=x*y;用來計算兩個數(shù)的和與積。注意這是兩個返回變量的情況。另外,x,y當(dāng)然可以是數(shù)組。用mcc命令生成了test.hpp和test.cpp。文件demo.cpp:#includestdafx.h#includematlab.h

12、pp#includetest.hppvoidmccDemo()CStringstr;mwArrayx,y,sum,prod;doubledx,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=%fn%f*%f=%f,dx,dy,dsum,dx,dy,dprod);AfxMessageBox(str);由于采用了C+數(shù)學(xué)庫,語法很簡單。注意數(shù)組的賦值、其中數(shù)據(jù)的存取,這些都要仔細(xì)地看手冊。最后是跳出一個消息框,顯示計算結(jié)

13、果。改程序啟動之后,選擇菜單mcc-demo即可。-Matlab與C+接口與混合編程討論小結(jié)(三)第二章、第一節(jié)、用c編寫mex程序開篇用C編寫mex程序大家都知道,matlab是一種解釋型的編程環(huán)境,也就是說,跟以前的basic一樣,是讀一句執(zhí)行一句的。這樣做可以很方便的實現(xiàn)編程過程中的交互,也免去了麻煩又耗時的編譯過程。但凡事有一利必有一弊,matlab在執(zhí)行時速度慢也就根源于此。在matlab里ticfori=1:10000b(i)=a(10001-i);end怎么樣,是不是很慢?你的程序里如果再多幾個這樣的循環(huán),運行速度就可想而知了。上面程序的功能是將向量a里的數(shù)據(jù)逆序賦給向量b。下面

14、的程序可以實現(xiàn)相同的功能ticb=a(10000:-1:1);為什么這個程序運行速度就這么快呢?這是因為matlab里的基礎(chǔ)矩陣運算函數(shù),像轉(zhuǎn)置,復(fù)制等等,都是以二進(jìn)制程序的形式存在的,運行起來速度當(dāng)然比解釋執(zhí)行10000次所以編matlab程序時,應(yīng)該盡量避免用循環(huán)語句,而使用等效的矩陣運算。雖然這樣但總是有的時候沒法找到對應(yīng)的矩陣運算來等效,或編出來的程序復(fù)雜得讓人沒法修簡單地說,mex程序就是根據(jù)一定的接口規(guī)范(mtlab提出的)編寫的一個dll,matla比如我編了一個mex函數(shù),名字叫max2.dll,那么只要把這個dll所在的目錄加到matlab的搜索路徑里(用addpath),就

15、可以像調(diào)用普通matlab函數(shù)一樣來調(diào)用它了。因為把循環(huán)體放到了二進(jìn)制程序中,執(zhí)行速度快得多。Mex文件既可以用c,也可以用fortran來編。因為我用的是c語言,所以下面的介紹都是用c語言編寫mex文件的方法。如果你用的是fortran,請你自己去看Apiguide.pdf,里面有詳細(xì)說明。開場說明我的論文里的程序大多是用matlab編的,因為方向是圖像處理,速度上的限制很大。不得已,拿著apiguide.pdf啃了兩天,才算摸出點門道?,F(xiàn)在論文寫完了,想著這點經(jīng)驗也許有用,就不淺薄,打算把它寫下來。因為還要備論文講稿,還有一堆表要填,不知能否寫完,在這里預(yù)為說明,到時莫要罵我。:文講稿,還

16、有一堆表要填,不知能否寫完,在這里預(yù)為說明,到時莫要罵我。:-Matlab與C+接口與混合編程討論小結(jié)(四)第二章、第二節(jié)、用c編寫mex程序一標(biāo)題:用C編寫mex程序PART2前面說到通過把耗時長的函數(shù)用c語言實現(xiàn),并編譯成mex函數(shù)可以加快執(zhí)行速度。這Matlab5.1本身是不帶c語言的編譯器的,所以要求你的機器上已經(jīng)安裝有VC,BC或WatcomC中的一種。如果你在安裝Matlab時已經(jīng)設(shè)置過編譯器,那么現(xiàn)在你應(yīng)該就可以使用mex命令來編譯c語言的程序了。如果當(dāng)時沒有選,只要在Matlab里鍵入mex-setup,就會出現(xiàn)一個DOS方式窗口,下面只要根據(jù)提示一步步設(shè)置就可以了。由于我用的

17、是w聽說Matlab5.2已經(jīng)內(nèi)置了C語言的編譯器,那么下面的這些可能就用不著了??上КF(xiàn)需要注意的是,在設(shè)置編譯器路徑時,只能使用路徑名稱的8字符形式。比如我用的VC5裝在路徑C:PROGRAMFILESDEVSTUDIO下,那在設(shè)置路徑時就要寫成:C:PROGRA1這樣設(shè)置完之后,mex就可以執(zhí)行了。為了測試你的路徑設(shè)置正確與否,把下面的程序存為hello.c。存為hello.c。存為hello.c。#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)mexPrintf(hello,world

18、!n);假設(shè)你把hello.c放在了C:TEST下,在Matlab里用CDC:TEST將當(dāng)前目錄改為C:TEST(注意,僅將C:TEST加入搜索路徑是沒有用的)?,F(xiàn)在敲:mexhello.c如果一切順利,編譯應(yīng)該在出現(xiàn)編譯器提示信息后正常退出。如果你已將C:TEST加入了搜索路徑,現(xiàn)在鍵入hello,程序會在屏幕上打出一行:hello,world!看看CTEST目錄下,你會發(fā)現(xiàn)多了一個文件:HELLO.DLL。這樣,第一個mex函數(shù)就算完成了。怎么樣,很簡單吧。下一次,會對這個最簡單的程序進(jìn)行分析,并給它增加一些功能。-Matlab與C+接口與混合編程討論小結(jié)(五)第二章、第三節(jié)、用c編寫me

19、x程序三標(biāo)題:用C編寫mex程序PART3分析hello.c,可以看到程序的結(jié)構(gòu)是十分簡單的,整個程序由一個接口子過程mexFunction構(gòu)成。前面提到過,Matlab的mex函數(shù)有一定的接口規(guī)范,就是指這nlhs:輸出參數(shù)數(shù)目plhs:指向輸出參數(shù)的指針nrhs:輸入?yún)?shù)數(shù)目例如,使用a,b=test(c,d,e)調(diào)用mex函數(shù)test時,傳給test的這四個參數(shù)分別是2,plhs,3,prhs。其中:prhs0=cprhs1=dprhs2=eprhs2=eprhs2=e當(dāng)函數(shù)返回時,將會把你放在plhs0,plhs1里的地址賦給a和b,達(dá)到返回數(shù)據(jù)的目的。細(xì)心的你也許已經(jīng)注意到,prhs

20、i和plhsi都是指向類型mxArray類型數(shù)據(jù)的指針。這個類型是在mex.h中定義的,事實上,在Matlab里大多數(shù)數(shù)據(jù)都是以這種類型存在。當(dāng)然還有其他的數(shù)據(jù)類型,可以參考Apiguide.pdf里的介紹。為了讓大家能更直觀地了解參數(shù)傳遞的過程,我們把hello.c改寫一下,使它能根據(jù)輸入?yún)?shù)的變化給出不同的屏幕輸出:/hello.c2.0#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)inti;i=mxGetScalar(prhs0);if(i=1)mexPrintf(hello,wor

21、ld!n);elsemexPrintf(大家好!HYPERLINKfile:/nn);將這個程序編譯通過后,執(zhí)行hello(1),屏幕上會打出:hello,world!而hello(0)將會得到:大家好!現(xiàn)在,程序hello已經(jīng)可以根據(jù)輸入?yún)?shù)來給出相應(yīng)的屏幕輸出。在這個程序里,除了用到了屏幕輸出函數(shù)mexPrintf(用法跟c里的printf函數(shù)幾乎完全一樣)外,還用到了一個函數(shù):mxGetScalar,調(diào)用方式如下:i=mxGetScalar(prhs0);Scalar就是標(biāo)量的意思。在Matlab里數(shù)據(jù)都是以數(shù)組的形式存在的,mxGetScalar的作用就是把通過prhs0傳遞進(jìn)來的mx

22、Array類型的指針指向的數(shù)據(jù)(標(biāo)量)賦給C程序里的變量。這個變量本來應(yīng)該是double類型的,通過強制類型轉(zhuǎn)換賦給了整形變量i。既然有標(biāo)量,顯然還應(yīng)該有矢量,否則矩陣就沒法傳了。看下面的程序:/hello.c2.1/hello.c2.1#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)int*i;i=mxGetPr(prhs0);if(i0=1)mexPrintf(hello,world!n);elsemexPrintf(大家好!HYPERLINKfile:/nn);這樣,就通過mxGetP

23、r函數(shù)從指向mxArray類型數(shù)據(jù)的prhs0獲得了指向double類型的指針。但是,還有個問題,如果輸入的不是單個的數(shù)據(jù),而是向量或矩陣,那該怎么處理呢?通過mxGetPr只能得到指向這個矩陣的指針,如果我們不知道這個矩陣的確切大小,就沒法對它進(jìn)行計算。為了解決這個問題,Matlab提供了兩個函數(shù)mxGetM和mxGetN來獲得傳進(jìn)來參數(shù)的行數(shù)和列數(shù)。下面例程的功能很簡單,就是獲得輸入的矩陣,把它在屏幕上顯示出來:/show.c1.0#includemex.h#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxAr

24、ray*prhs)double*data;intM,N;inti,j;data=mxGetPr(prhs0);/獲得指向矩陣的指針M=mxGetM(prhs0);/獲得矩陣的行數(shù)N=mxGetN(prhs0);/獲得矩陣的列數(shù)for(i=0;ifor(j=0;jmexPrintf(%4.3f,dataj*M+i);mexPrintf(HYPERLINKfile:/nn);編譯完成后,用下面的命令測試一下:a=1:10;b=a;a+1;show(a)show(b)需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數(shù)為零,Matlab里的矩陣元素b(i,j)在傳遞到C

25、中的一維數(shù)組大data后對應(yīng)于dataj*M+i。-Matlab與C+接口與混合編程討論小結(jié)(六)第二章、第四節(jié)、用c編寫mex程序四標(biāo)題:用C編寫mex程序PART4輸入數(shù)據(jù)是在函數(shù)調(diào)用之前已經(jīng)在Matlab里申請了內(nèi)存的,由于mex函數(shù)與Matlab共用同一個地址空間,因而在prhs里傳遞指針就可以達(dá)到參數(shù)傳遞的目的。但是,輸出參數(shù)卻需要在mex函數(shù)內(nèi)申請到內(nèi)存空間,才能將指針放在plhs中傳遞出去。由于返回指針類型必須是mxArray,所以Matlab專門提供了一個函數(shù):mxCreateDoubleMatrix來實現(xiàn)內(nèi)存的申請,函數(shù)原型如下:mxArray*mxCreateDoubleM

26、atrix(intm,intn,mxComplexityComplexFlag)m:待申請矩陣的行數(shù)n:待申請矩陣的列數(shù)為矩陣申請內(nèi)存后,得到的是mxArray類型的指針,就可以放在plhs里傳遞回去了。但是對這個新矩陣的處理,卻要在函數(shù)內(nèi)完成,這時就需要用到前面介紹的mxGetPr。使用mxGetPr獲得指向這個矩陣中數(shù)據(jù)區(qū)的指針(double類型)后,就可以對這個矩陣進(jìn)行各種操作和運算了。下面的程序是在上面的show.c的基礎(chǔ)上稍作改變得到的,功能是將輸/reverse.c1.0#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrh

27、s,constmxArray*prhs)double*inData;double*outData;intM,N;inti,j;inData=mxGetPr(prhs0);M=mxGetM(prhs0);N=mxGetN(prhs0);plhs0=mxCreateDoubleMatrix(M,N,mxREAL);outData=mxGetPr(plhs0);for(i=0;ifor(j=0;jxREAL);outData=mxGetPr(plhs0);for(i=0;ifor(j=0;joutDataj*M+i=inData(N-1-j)*M+i;當(dāng)然,Matlab里使用到的并不是只有doubl

28、e類型這一種矩陣,還有字符串類型、稀疏矩陣、結(jié)構(gòu)類型矩陣等等,并提供了相應(yīng)的處理函數(shù)。本文用到編制mex程序中最經(jīng)常遇到的一些函數(shù),其余的詳細(xì)情況清參考Apiref.pdf。-Matlab與C+接口與混合編程討論小結(jié)(七)第二章、第五節(jié)、用c編寫mex程序五標(biāo)題:用C編寫mex程序PART5通過前面兩部分的介紹,大家對參數(shù)的輸入和輸出方法應(yīng)該有了基本的了解。具備了這些知識,就能夠滿足一般的編程需要了。但這些程序還有些小的缺陷,以前面介紹的re由于前面的例程中沒有對輸入、輸出參數(shù)的數(shù)目及類型進(jìn)行檢查,導(dǎo)致程序的容錯性很#includemex.hvoidmexFunction(intnlhs,mx

29、Array*plhs,intnrhs,constmxArray*prhs)double*inData;double*outData;intM,N;intM,N;/異常處理/異常處理if(nrhs!=1)mexErrMsgTxt(USAGE:b=reverse(a)n);if(!mxIsDouble(prhs0)mexErrMsgTxt(theInputMatrixmustbedouble!n);inData=mxGetPr(prhs0);M=mxGetM(prhs0);N=mxGetN(prhs0);plhs0=mxCreateDoubleMatrix(M,N,mxREAL);outData=

30、mxGetPr(plhs0);for(i=0;ifor(i=0;ifor(j=0;joutDataj*M+i=inData(N-1-j)*M+i;在上面的異常處理中,使用了兩個新的函數(shù):mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在給出出錯提示的同時退出當(dāng)前程序的運行。MxIsDouble則用于判斷mxArray中的數(shù)據(jù)是否double類型。當(dāng)然Matlab還提供了許多用于判斷其他數(shù)據(jù)類型的函數(shù),這里不加詳述。需要說明的是,Matlab提供的API中,函數(shù)前綴有mex-和mx-兩種。帶mx-前綴的大多是對mxArray數(shù)據(jù)進(jìn)行操作的函數(shù),如mxIsDouble,mx

31、CreateDoubleMatrix等等。而帶mx前綴的則大多是與Matlab環(huán)境進(jìn)行交互的函數(shù),如mexPrintf,mxErrMsgTxt等等。了解了這一點,對在Apiref.pdf中查找所需的函數(shù)很有幫助。至此為止,使用C編寫mex函數(shù)的基本過程已經(jīng)介紹完了。下面會在介紹幾個非常有用的函數(shù)調(diào)用。如果有足夠的時間,也許還會有一個更復(fù)雜一些的例程。-Matlab與C+接口與混合編程討論小結(jié)(八)第二章、第六節(jié)、用c編寫mex程序六標(biāo)題:用C編寫mex程序PART6我們之所以使用Matlab,很重要的考慮是Matlab提供了相當(dāng)豐富的矩陣運算函數(shù)和各種toolbox。在編制mex函數(shù)時,有時我

32、們也會遇到一些操作,在Matlab下,只需要一個為了在mex函數(shù)里調(diào)用Matlab命令,我們就需要用到一個函數(shù)mexCallMATLAB,原型如下:intmexCallMATLAB(intnlhs,mxArray*plhs,intnrhs,mxArray*prhs,constchar*command_name);有了前面的基礎(chǔ),使用這個函數(shù)就顯得十分容易了。下面給出一個例程,功能是將輸入#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)double*inData;mxArray*IN1;mxA

33、rray*OUT1;double*outData;intM,N;inti,j;/異常處理if(nrhs!=1)mexErrMsgTxt(USAGE:b=rot(a)n);if(!mxIsDouble(prhs0)mexErrMsgTxt(theInputMatrixmustbedouble!n);/計算轉(zhuǎn)置if(mexCallMATLAB(1,OUT,1,prhs,)mexErrMsgTxt(Errorwhencompute!n);/根據(jù)輸入?yún)?shù)數(shù)目決定是否顯示if(nlhs=0)mexCallMATLAB(0,IN,1,OUT,disp);elseplhs0=OUT0;關(guān)于這個例子,相信大家

34、一看就明白,我就不多說了。-Matlab與C+接口與混合編程討論小結(jié)(九)第三章、Matcom的使用3.1概述3.1.1Matcom能作什么Matcom是一個十分有用的.m文件翻譯器(Replacement),它的主要優(yōu)點我認(rèn)為有以下幾點:1它提供了matlab中.m文件與其他高級語言的接口,使.m文件可以編譯為脫離matlab環(huán)境獨立執(zhí)行的可執(zhí)行性程序,這樣。提高了代碼的復(fù)用率。提高了代碼的執(zhí)行速度。使純文本的.m文件變?yōu)槎M(jìn)制的可執(zhí)行程序,增加了知識保護(hù)的安全性2它提供了近千個數(shù)學(xué)函數(shù),對于其他高級語言編譯器來說,提供了一個豐富的數(shù)學(xué)庫,基本上在matlab上能用的常用函數(shù)都可以在高級語言

35、中直接調(diào)用。數(shù)學(xué)函數(shù)主要包括:。矩陣屬性函數(shù)。矩陣生成函數(shù)。矩陣生成函數(shù)。矩陣操作函數(shù)。矩陣變換函數(shù)。數(shù)學(xué)函數(shù)。特殊函數(shù)。數(shù)值函數(shù)。串函數(shù)。繪圖函數(shù)。顏色函數(shù)。函數(shù)函數(shù)。存盤及讀文件。系統(tǒng)資源函數(shù)。系統(tǒng)操作函數(shù)。判斷函數(shù)(Is函數(shù)族)。付氏變換等等,可參見本文附錄3提供了.m文件的方便快捷的編譯調(diào)適環(huán)境,可以step,watch,breakpoint等各種調(diào)試手段。3.1.2Matcom的工作原理Matcom的矩陣運算部分是基于一個名為Matrix的C+數(shù)學(xué)庫,這個庫提供了絕大多數(shù)的關(guān)于矩陣類、矩陣操作函數(shù)、數(shù)值計算函數(shù)、數(shù)學(xué)函數(shù)等的定義,在Matcom中是以lib目錄下的*.lib以及win

36、dows/system/對應(yīng)名稱的dll文件提供的。Matcom的另一大部分就是圖形部分,它是用一種非常流行的繪圖OCX控件Teechart來實現(xiàn)的,這種控件對于一般的繪圖功能都可以實現(xiàn),但也存在一定缺陷。在Matcom4.5版本中使用的是TeeChart3.0。繪圖函數(shù)功能主要在lib文件和window/system/ago*.dll中定義的。Matcom編譯.m文件是先將.m文件按照與matcom的Cpp庫的對應(yīng)關(guān)系,翻譯為CPP源代碼,然后用對應(yīng)版本的C編譯器將該CPP文件編譯為exe或dll文件,所以,在第一次運行時讓指定CComplier的路徑是必需的,否則將無法編譯。指定好的CCo

37、mplier的信息寫在Matcom/bin/matcom.ini文件中。-Matlab與C+接口與混合編程討論小結(jié)(十)3.1.3Matcom的不足Matcom并不是全能的,對于大多數(shù)Matlab函數(shù)都可以進(jìn)行CPP實現(xiàn),但有些由于其功能有限,只能期待以后的版本來不斷補充了??偟膩碚f,matcom有以下缺欠:1.對class數(shù)據(jù)類型部分支持2.eval,feval,clear等語句不能在C中實現(xiàn)(如果實現(xiàn)的話,一個文本編輯器就可以成為一個matlab了:)3.圖形窗口有些不僅如人意,如fill3,hide等語句無法實現(xiàn),surf等語句也無法畫出象matlab中哪樣精細(xì)的圖像來,特別是色彩比較難

38、看:(等等3.1.4Matcom下載地址及網(wǎng)絡(luò)資源下載地址是版上詢問最多的問題,再次建議大家能到教育網(wǎng)的搜索引擎HYPERLINK:8000/:8000/HYPERLINK/HYPERLINK/search.php/search.php搜索關(guān)鍵字matcom或MIDEVA,可以查找教育網(wǎng)上的最新的matcom資源Matcom的開發(fā)者M(jìn)athtools公司地址是HYPERLINK/上面也提供了免費下載服務(wù)(他們還會給你一個evaluationkey),如果你從哪里下載,他們會給你定期發(fā)email告訴最新的動態(tài)。大家可以定期到公司主頁看看有沒有版本更新-Matlab與C+接口與混合編程討論小結(jié)(十

39、一)3.2版本及安裝注意事項3.2.1Matcom4.0的安裝由于matcom4.0所代的dll文件相對較小,所以便于發(fā)布小型程序,所以這里也對它作一定討論。matcom4.0在第一次使用時需要你輸入口令,否則無法運行,不過網(wǎng)上已經(jīng)有matcom4的注冊機,可以查找一個叫regmat4.exe的小程序,輸入你想使用的時間區(qū)間,然后就會產(chǎn)生一個合法口令,輸入這個口令后,mideva在window目錄建立一個名字叫mt_eval.txt的文本文件,里面就保存了你輸入的口令,不過你也可以在執(zhí)行matcom之前直接建立這個文件,在里面寫1/1/1999-1/1/2010-64562264就可使用到20

40、10年。通過了口令后,它還有一些限制,如繪圖時間不超過60分鐘限制,繪圖時出現(xiàn)版權(quán)對話框等,不過這些已經(jīng)被energy等諸位大蝦給破解了具體如下energy:使用PLOT功能時會出現(xiàn)一個對話框,可以這樣去掉:C:Windowssystemago.dllFIND:83C40885C07505REP:EB-如果還想去掉figure標(biāo)題欄上的Evaluationsoftware:FIND:4361707475726500205BREP:00huangfh(hoho)對60分鐘時間的破解,就比較完整了:FIND:2BD181FA100E00007E10REP:EB-3.2.2Matcom4.5的安裝感

41、謝energy的破解,Matcom4.5的口令為FREE-4.5-1193046-80295111matcom4.5在安裝時需要你輸入口令,mideva在window的注冊表中HKEY_CURRENT_USERSoftwareMathToolsMatcom4.50License下面添加一個鍵,鍵名默認(rèn),鍵值為FREE-4.5-1193046-80295111你如果刪除它,再次啟動matcom的時候,就會再次詢問口令。不過好在如果通過這個口令之后,程序發(fā)布時就不再有限制了,也就是在這個注冊后的系統(tǒng)中編譯的程序,發(fā)布時就不用代一個注冊文件了-Matlab與C+接口與混合編程討論小結(jié)(十二)3.3用

42、Matcom翻譯m文件直接調(diào)適M文件:在主界面上打開.m文件的主文件,在菜單中選擇compiletoexeordll就可以了,你也可以設(shè)置斷點后,就可以查看變量的值,這些將在主窗口的一側(cè)出現(xiàn),雙擊就可得到其當(dāng)前值。編譯后的cpp、exe、dll文件都在matcom當(dāng)前工作目錄下,如果是debug模式,就在dubug目錄下找,否則就在Release目錄下找。3.4在C+Builder3.0中C+與Matlab語言混編這種方法是我最喜歡的方法,因為這樣不但可以發(fā)揮matcom強大的數(shù)學(xué)計算功能,還可以結(jié)合可視化編譯環(huán)境來進(jìn)行界面開發(fā),可以制作完整的應(yīng)用計算軟件,交付用戶使用。我所用的可視IDE是I

43、nprise公司的C+Builder3.0/4.0,matcom版本為4.0/4.5,注意,在CB4.0上只能使用matcom4.5版本。在進(jìn)行編程之前你需要作如下準(zhǔn)備工作1.選擇菜單NewConsoleWizardConsoleExe,建立一個Win32位DOS程序2.將matcomlibmatlib.h拷貝到CBinclude目錄下將matcomlibv4500b.lib拷貝到CBlib目錄下3.選擇菜單ProjectAddtoproject選擇libv4500.lib于是程序變?yōu)?pragmahdrstop#include#includestdio.h#includematlib.h/U

44、SELIB(v4500b.lib);/#pragmaargsusedintmain(intargc,char*argv)/*/PleaseWriteYourCodeHere*/*/return0;3.選擇菜單ProjectAddtoReportaries將該工程存為Project中的一個模板。3.選擇菜單ProjectAddtoReportaries將該工程存為Project中的一個模板。OK,現(xiàn)在可以進(jìn)行你所需要的工作了。用菜單你存為的模板建立一個新的工程,在代碼段寫dMm(a);/defineaMatrixclassa=zeros(3);/Letthematrixbea3*3zeromat

45、rixdisp(a);/Displaythematrix運行一下看看,程序會打印出3*3的0零陣稍微復(fù)雜一點的程序dMm(a);dMm(b);dMm(c);/聲明三個矩陣a=rand(3,2);/生成3*2隨機陣b=zeros(3,2);c=a+b;/矩陣相加c(1,c_p)=a(2,c_p);/matlab中寫為c(1,:)=a(2,:)c=ctranspose(c);/矩陣轉(zhuǎn)置disp(c);printf(HYPERLINKfile:/nn);disp(a);printf(HYPERLINKfile:/nn);getch();c(colon(1,1,3)=a(colon(1,2,5);/m

46、atlab中寫為c(1:1:3)=a(1:2:5)disp(c);getch();getch();getch();可以發(fā)現(xiàn)在matlab中常用的一些表示都可以在matcom中找到對應(yīng),并且同樣方便有效。再舉一個繪圖的例子,就用matcom自己帶的例子吧subplot(121.0);/subplot(1,2,1)surf(CL(peaks(25.0);/surf(peaks(25)subplot(122.0);/subplot(1,2,2)pcolor(CL(peaks(25.0);/pcolor(peaks(25)colormap(TM(copper);/colormap(copper)dra

47、wnow()/必須有這句,否則只畫一個圖出來/這是我問他們的技術(shù)支持搞到的可以看到基本上是一句對一句,沒有什么多余的話。所以習(xí)慣編寫matlab程序的同志寫matcomC的語句來也應(yīng)該沒有什么問題。(但上面這個程序確實有問題,在mideva中編譯后第二個subplot是可以正常畫出來的,但在CB中編譯就只畫一個subplot樂,具體原因希望大家討論,我現(xiàn)在也在試),mideva編譯該語句的指令是bcc32文件名-IC:MATCOM45lib-H=matlib.csm-v-a4-5-eEXEFLAGS=-WCDLLFLAGS=-WD我想CB中可能要改option,大家試試看。總的說來,決大多數(shù)的

48、matlab的語句都可以輕松移植到CB中來,所以就可以直接在CB中寫matlab程序了,只是大家要注意幾個關(guān)鍵的函數(shù)colon(xstart,xstep,xstop)=xstart:xstep:xstop(CL(A1),A2,A3)=(A1,A2,A3,.)一個矩陣行,大多數(shù)多參數(shù)輸入函數(shù)都用到CL(BR(a1),a2,a3)=(a1,a2,a3.)TM(astring)=astringTM將char*變?yōu)榇仃嘽_p=:整行或整列i_o=out=fun(in)就寫為fun(in,i_o,out)其他的大家編幾個程序就清楚了。-Matlab與C+接口與混合編程討論小結(jié)(十三)3.6程序的發(fā)布m

49、atcom可以用C編譯器把.m文件編譯為為stand_alone的程序,所以,基本上不需要matlab系統(tǒng),但一些必要的dll文件還是需要的,這些dll在windowsystem下面,(在4.5版本中)大概有ago4500.dll,v4500v.dll,opengl32.dll,glu32.dll等四個文件如果用的是4.0版本,發(fā)布時要把ago.dll,mlib4.dll(計不清楚了),opengl32.dll和glu32.dll打到安裝盤中,大概3M,然后在window目錄安裝一個名字叫mt_eval.txt的文本文件,里面寫1/1/1999-1/1/2010-64562264即可-Matl

50、ab與C+接口與混合編程討論小結(jié)(十四)附錄:MatcomC數(shù)學(xué)庫函數(shù)列表(部分)這是一個豐富的數(shù)學(xué)庫,約600個函數(shù),包括sim()函數(shù)矩陣基礎(chǔ)類系統(tǒng)常數(shù)特殊函數(shù)異常處理函數(shù)矩陣生成函數(shù)操作系統(tǒng)資源函數(shù)數(shù)值計算函數(shù)數(shù)學(xué)函數(shù)矩陣操作函數(shù)矩陣屬性函數(shù)圖形函數(shù)顏色函數(shù)用戶介面函數(shù)is*函數(shù)族mex函數(shù)字符串函數(shù)字符串函數(shù)字符串函數(shù)類型轉(zhuǎn)換函數(shù)*矩陣基礎(chǔ)類*classMmDLLIMm();DLLIMm(intisc,intiss,intnonzeros,intnrows,intncols,mt_matrix_typesnew_type=mt_double_matrix);DLLIMm(intisc,

51、intiss,intnonzeros,intnew_ndims,constintnew_dimsmax_ndims,mt_matrix_typesnew_type=mt_double_matrix);DLLIMm(i_o_t,constchar*mname,intisglobal);DLLIMm(constchar*mname,intm,intn);DLLIMm(intaisc,cMmx,cMmy,cMmdim1,op_top,intdo_dim,Mm&minmax_idx);DLLIMm(m_typesrc);DLLIMm(cMmsrc);DLLIMm(cMmsrc,constchar*mn

52、ame);DLLIMm(constMc&src);DLLIMm(cMrsrc,interr=1);DLLIMm();MmRDLLIoperator=(cMmsrc);voidDLLIdeepcopy(cMmsrc,mt_matrix_typesnew_type=mt_uninit_matrix);voidDLLIdeepcopy(intisc,cMmsrc,mt_matrix_typesnew_type=mt_uninit_matrix);voidDLLIdeepcopy(intisc,intiss,cMmsrc,mt_matrix_typesnew_type=mt_uninit_matrix

53、);intDLLIgetreal(intforce=0)const;intDLLIgetcomplex();voidDLLIcollapse();inlineintDLLIrows()constreturndims0;inlineintDLLIcols()constreturndims1;intDLLIsize()const;intDLLIsize(intdim)const;intDLLInsingleton()const;intDLLIvectordim()const;intDLLIlength()const;constcharPDLLIgetname()constreturnself_na

54、me;voidDLLIsetname(constchar*new_name);intDLLIisstr()constreturn(flags.str!=0);voidDLLIsetstr(intnewd);inlineintDLLIissparse()constreturn(flags.sparse!=0);voidDLLIsetsparse(intsp);inlineintDLLIislogical()constreturn(flags.logical!=0);return(flags.logical!=0);voidDLLIsetlogical(intnewd);inlineintDLLI

55、isglobal()constreturn(flags.global!=0);inlineintDLLIisstruct()constreturn(fields!=NULL);inlineintRDLLIgetndims()constreturn(int&)ndims;inlineintPDLLIgetdims()constreturn(int*)dims;inlineM_typesRDLLIgetflags()returnflags;inlinemt_matrix_typesDLLIgettype()constreturnflags.type;inlineintDLLIgetnfields(

56、)constreturnnfields;inlineconstcharPPDLLIgetfields()constreturnfields;inlineintDLLIisc()constreturn(pi!=NULL);intDLLIissamename(constchar*s)constreturns=self_name;intDLLIdirty()const;intDLLIgetp()constreturnp;MmDLLIsafebr(inti0)const;inlinem_typePDLLIgetpr(m_type*)constreturn(m_type*)pr;inlinem_type

57、PDLLIgetpi(m_type*)constreturn(m_type*)pi;inlineuint8PDLLIgetpr(uint8*)constreturn(uint8*)pr;inlineuint8PDLLIgetpi(uint8*)constreturn(uint8*)pi;inlineMmPDLLIgetpr(Mm*)constreturn(Mm*)pr;inlineMmPDLLIgetpi(Mm*)constreturn(Mm*)pi;inlinem_typePDLLIgetpr(m_type*,inti0)constreturni0-1+(m_type*)pr;inlinem

58、_typePDLLIgetpi(m_type*,inti0)constreturni0-1+(m_type*)pi;inlineuint8PDLLIgetpr(uint8*,inti0)constreturni0-1+(uint8*)pr;inlineuint8PDLLIgetpi(uint8*,inti0)constreturni0-1+(uint8*)pi;inlineMmPDLLIgetpr(Mm*,inti0)constreturni0-1+(Mm*)pr;inlineMmPDLLIgetpi(Mm*,inti0)constreturni0-1+(Mm*)pi;inlinem_type

59、PDLLIgetpr(m_type*,inti0,inti1)constreturni0-1+(i1-1)*dims0+(m_type*)pr;inlinem_typePDLLIgetpi(m_type*,inti0,inti1)constreturni0-1+(i1-1)*dims0+(m_type*)pi;inlineuint8PDLLIgetpr(uint8*,inti0,inti1)constreturni0-1+(i1-1)*dims0+(uint8*)pr;inlineuint8PDLLIgetpi(uint8*,inti0,inti1)constreturni0-1+(i1-1)

60、*dims0+(uint8*)pi;inlineMmPDLLIgetpr(Mm*,inti0,inti1)constreturni0-1+(i1-1)*dims0+(Mm*)pr;inlineMmPDLLIgetpi(Mm*,inti0,inti1)constreturni0-1+(i1-1)*dims0+(Mm*)pi;m_typePDLLIaddr()const;m_typePDLLIaddr(inti0)const;m_typePDLLIaddr(inti0,inti1)const;m_typePDLLIaddi()const;m_typePDLLIaddi(inti0)const;m_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論