![Matlab和C混合編程的幾種方法比較_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/20/b6cbe541-036a-441c-8766-ac3c2997e67a/b6cbe541-036a-441c-8766-ac3c2997e67a1.gif)
![Matlab和C混合編程的幾種方法比較_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/20/b6cbe541-036a-441c-8766-ac3c2997e67a/b6cbe541-036a-441c-8766-ac3c2997e67a2.gif)
![Matlab和C混合編程的幾種方法比較_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/20/b6cbe541-036a-441c-8766-ac3c2997e67a/b6cbe541-036a-441c-8766-ac3c2997e67a3.gif)
![Matlab和C混合編程的幾種方法比較_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/20/b6cbe541-036a-441c-8766-ac3c2997e67a/b6cbe541-036a-441c-8766-ac3c2997e67a4.gif)
![Matlab和C混合編程的幾種方法比較_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/20/b6cbe541-036a-441c-8766-ac3c2997e67a/b6cbe541-036a-441c-8766-ac3c2997e67a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Matlab和C混合編程的幾種方法比較楊允軍 整理并調(diào)試第一部分 概述Matlab是Mathworks公司于1982年推出的一套高性能的數(shù)值計(jì)算和可視化軟件,到2005年已發(fā)行到R14(Matlab 7.0),主流版本有4.0,5.3,6.1,6.5。它是一種面向科學(xué)計(jì)算和數(shù)值分析的軟件,涵蓋了通信、短陣運(yùn)算、圖像處理、金融分析、模糊控制、自動(dòng)控制、信號(hào)處理、系統(tǒng)仿真、微分計(jì)算等方面。它提供了強(qiáng)大的科學(xué)運(yùn)算、靈活的程序設(shè)計(jì)流程、高質(zhì)量的數(shù)字圖像處理等功能,突出的優(yōu)點(diǎn)是強(qiáng)大的運(yùn)算功能和近乎完美的繪圖功能。然而Matlab自身存在的一些不足使其在開發(fā)應(yīng)用系統(tǒng)時(shí)受到局限,主要表現(xiàn)為以下幾個(gè)方面: (
2、1)Matlab語言是一種解釋執(zhí)行的腳本語言,其程序運(yùn)行效率低,特別是在編制大型復(fù)雜的應(yīng)用系統(tǒng)時(shí)達(dá)不到理想的效果。 (2)Matlab編寫的M文件是文本文件,很容易被直接讀取,無法保護(hù)開發(fā)者的勞動(dòng)成果。(3)Matlab編寫的程序只能在Matlab的平臺(tái)下運(yùn)行,不具備跨平臺(tái)的能力,可移植性差。(4)開發(fā)應(yīng)用系統(tǒng)的界面能力差,很難做出友好的應(yīng)用界面。以上幾點(diǎn)是VC等高級(jí)編程語言所專長(zhǎng)的,而VC等高級(jí)編程語言在工程計(jì)算、復(fù)雜的數(shù)學(xué)計(jì)算、數(shù)字圖形處理方面以及特定的學(xué)科領(lǐng)域的計(jì)算處理上遠(yuǎn)遠(yuǎn)不及Matlab。因此將二者結(jié)合起來,各取所長(zhǎng),將能更好地滿足實(shí)際應(yīng)用中的需要。為了實(shí)現(xiàn)混合編程,Matlab 5
3、0以后的版本自帶了C語言編譯器(Compiler),可以將M文件轉(zhuǎn)換為CMEX或CC +程序。根據(jù)是否需要Matlab環(huán)境,一般將Matlab與VC +混合編程分為兩大類:Matlab在后臺(tái)運(yùn)行和可以脫離Matlab環(huán)境運(yùn)行。歸納起來Matlab與C接口有如下幾種方法:1 Matlab引擎(Engineer)采用客戶/服務(wù)器的計(jì)算方式,通過Windows的ActiveX通道和Matlab相結(jié)合。在具體的應(yīng)用中,VC +的程序作為前端客戶機(jī),通過調(diào)用Matlab Engineer在后臺(tái)與Matlab服務(wù)器建立連接,實(shí)現(xiàn)動(dòng)態(tài)通信。這種方法實(shí)現(xiàn)較為簡(jiǎn)單;不要求連接整個(gè)Matlab,只需要嵌入必要的M
4、atlab Engineer庫,可大大地節(jié)省系統(tǒng)資源,但這種Matlab在后臺(tái)運(yùn)行的效率低下。2 Mideva(Matcom)是Mathtools公司推出的一種Matlab集成編譯開發(fā)平臺(tái),提供對(duì)Matlab程序文件(M文件)的解釋執(zhí)行和開發(fā)環(huán)境支持。經(jīng)過簡(jiǎn)單設(shè)置后,Mideva可以將M源文件轉(zhuǎn)換為CC+,然后添加到MSVC、VB、C+ Builder等的工程中。自從Mathtools公司并入Mathworks公司以后,Matcom就停止了研發(fā),最高版本為Matcom4.5。3 利用Mideva直接生成EXE文件后,故C+中通過Shell調(diào)用,常見的外部函數(shù)有shellexec()或weine
5、xec()。這種方法簡(jiǎn)單方便,但運(yùn)行時(shí)出現(xiàn)一個(gè)控制臺(tái)窗口,而且由于VC和Matlab之間不能交互,且通用性差,僅適用于VC中調(diào)用Matlab,實(shí)現(xiàn)圖形顯示的場(chǎng)合。4 借用C+編譯器將Matlab下的M文件轉(zhuǎn)換成DLL(動(dòng)態(tài)鏈接庫),其他應(yīng)用程序可直接調(diào)用該DLL。5 在C或者C+程序中使用Matlab提供的CC+ Math Library函數(shù)直接調(diào)用Matlab函數(shù)。(沒有嘗試過)6 按照Mideva的語法,在VC中直接書寫Matlab語句實(shí)現(xiàn)Matlab與C的混合編程。7 Addin實(shí)現(xiàn)Matlab與VC的混合編程是Matlab 60提供的一種最方便的方法,通過該方法,VC可直接在其開發(fā)環(huán)境
6、中將M文件轉(zhuǎn)換為CPP文件,并且可以現(xiàn)場(chǎng)修改M文件進(jìn)行調(diào)試。但是不知道為什么Matlab7.0取消了這種功能。8 MAT文件方法,也就是將Matlab產(chǎn)生的數(shù)據(jù),通過Matlab提供的一些函數(shù),在VC中讀取。這種方法沒有交互性可言。以上幾種方法各有利弊,方法1需要在安裝有Matlab的環(huán)境中運(yùn)行,可移植性差。方法2、3、4、5、6、7可以脫離Matlab環(huán)境運(yùn)行,移植性較好,但4、5、7 好像不支持圖形顯示,而且不能編譯Matlab的內(nèi)建函數(shù) build-in 函數(shù)(如fft、filter等)。相對(duì)來說,Matcom的Add-in 方法既簡(jiǎn)單功能又比較強(qiáng)大,但7.0以后的版本是否支持 Matc
7、om 尚不得而知。以上幾種方法大同小異,除了 MEX 方法是在Matlab中調(diào)用C語言外,其他都是在VC中調(diào)用Matlab,后者是應(yīng)用的主流。這里舉出幾種典型的方法及應(yīng)用實(shí)例,大體能滿足工程中互相調(diào)用的需求。幾個(gè)實(shí)例都調(diào)試通過。第二部分 實(shí)例2.1 C-MEX 實(shí)例2.1.1 引言有時(shí)僅僅為了加快運(yùn)算速度的需要,可以考慮用效率較高的C語言編寫耗時(shí)大的部分,并且通過Matlab的API接口轉(zhuǎn)化為C-MEX文件(在Windows系統(tǒng)中為DLL文件),和Matlab的普通函數(shù)一樣調(diào)用。周期譜理論是由W.A.Gardner 等人深入研究并發(fā)展的1,該理論的前提是認(rèn)為信號(hào)具有周期平穩(wěn)隨機(jī)性,而大多數(shù)的通
8、信信號(hào)符合這一特征。周期譜理論在信號(hào)檢測(cè)、分類、參數(shù)估計(jì)、同步、提取,尤其在低信噪比條件下可以取得滿意的效果。周期譜的工程計(jì)算分為時(shí)域平滑法和頻域平滑法,后者是先求出信號(hào)的短時(shí)Fourier變換,然后作相關(guān),存在計(jì)算量大的缺點(diǎn),在Matlab實(shí)現(xiàn)過程中,這個(gè)缺點(diǎn)在數(shù)據(jù)量較大時(shí)是無法忍受的。所以,找到一條能減小運(yùn)算時(shí)間的途徑是十分必要的。Matlab是一種解釋執(zhí)行的語言,用向量代替循環(huán)是其推薦的方法,但當(dāng)循環(huán)必不可少時(shí),僅僅在Matlab環(huán)境內(nèi)尋找優(yōu)化途徑就力不從心了,這時(shí)考慮從Matlab和其他高級(jí)語言的接口方面突破。Matlab為了解決上述問題,提供了外部接口,本文主要介紹它與C/C+的接口
9、。Matlab提供了一種生成和調(diào)用C-MEX文件的技術(shù),可以將m文件中耗時(shí)的代碼用C實(shí)現(xiàn),編譯成動(dòng)態(tài)庫文件(Windows中為dll),使得其可以作為Matlab的build-in函數(shù)使用,這種C-MEX文件的執(zhí)行效率比Matlab中的m函數(shù)要高。C-MEX文件的另一個(gè)優(yōu)勢(shì)是調(diào)試方便,可以在Matlab或借用VC環(huán)境進(jìn)行調(diào)試。當(dāng)然,Matlab還提供了其它一些技術(shù),如Mat文件、引擎方式、m文件編譯成動(dòng)態(tài)庫在VC中調(diào)用等。Mat文件只能傳遞變量數(shù)據(jù),應(yīng)用有限;引擎方式在程序運(yùn)行時(shí)啟用Matlab,慢且不方便;m文件通過Matlab的mcc編譯器編譯成動(dòng)態(tài)庫在VC中調(diào)用的方式相對(duì)來說完美,但也存
10、在調(diào)用動(dòng)態(tài)庫時(shí)語法復(fù)雜的缺點(diǎn)。本文介紹的C-MEX文件的方法接口簡(jiǎn)單、調(diào)用方便,可以大幅度減小周期譜的計(jì)算時(shí)間。2.1.2 原理C-MEX文件其實(shí)就是帶有Matlab接口的C文件編譯好的動(dòng)態(tài)連接庫,程序主要由兩部分組成:計(jì)算子程序和接口子程序23。前者包含了用于計(jì)算的源代碼,用來完成實(shí)際的計(jì)算工作,用C語言實(shí)現(xiàn);后者它是計(jì)算子例行程序同Matlab環(huán)境之間的接口,用來完成兩者之間的通信任務(wù)。接口子例行程序的名稱固定為mexFunction,該函數(shù)中以mx、mex開頭的函數(shù)是Matlab與C的接口函數(shù),mx-函數(shù)用來對(duì)mxArray結(jié)構(gòu)體類型的操作,mex-函數(shù)用來對(duì)外傳遞數(shù)據(jù)。mexFunct
11、ion函數(shù)有四個(gè)參數(shù),分別為prhs、nrhs、plhs和nlhs,其中prhs為一個(gè)mxArray結(jié)構(gòu)體類型的指針數(shù)組,該數(shù)組的數(shù)組元素按順序指向所有的輸入?yún)?shù);nrhs為int類型,用以表示輸入?yún)?shù)的個(gè)數(shù);plhs也是一個(gè)mxArray結(jié)構(gòu)體類型的指針數(shù)組,該數(shù)組的數(shù)組元素按順序指向所有的輸出參數(shù);nlhs為int類型,表示輸出參數(shù)的個(gè)數(shù)。以上兩個(gè)部分是典型的C-MEX文件格式,其工作原理如圖1所示。圖1 C-MEX的工作原理為了能夠在Matlab環(huán)境下運(yùn)行這個(gè)程序,必須首先配置MEX的編譯環(huán)境,其配置工作可在Matlab命令窗口中運(yùn)行mex setup,會(huì)提示選擇編譯器1 Lcc C v
12、ersion 2.4 in D:MATLAB6P5syslcc 2 Microsoft Visual C/C+ version 6.0 in D:Program FilesMicrosoft Visual Studio選擇Compiler: Microsoft Visual C/C+ 6.0,就可以在Matlab或者VC環(huán)境輸入C代碼,編譯生成C-MEX文件了,接下來介紹C-MEX文件的建立和調(diào)試。2.1.3 實(shí)現(xiàn)過程Matlab中調(diào)試MEX文件的錯(cuò)誤提示信息不容易理解,在VC中調(diào)試可以有效地解決這方面的問題,這里介紹VC環(huán)境下編譯生成及調(diào)試MEX文件的過程。(一)建立dll工程。在VC中創(chuàng)建
13、DLL工程SCFdll,在def文件中輸入LIBRARY SCFdll,EXPORTS mexFunction,表示庫文件名或者對(duì)外發(fā)布的包裝為SCFdll。(二)建立C文件,寫運(yùn)算子程序部分和接口子程序部分。新建C Source文件,加入#include mex.h語句,該頭文件在目錄externinclude下,所以還要在VC的include搜索路徑中包含externinclude,具體操作為在Tools-Options-Directories的inlcude搜索路徑中添加externinclude。因?yàn)橛玫搅薞C的編譯器,所以在lib搜索路徑中還要加入externlibwin32micr
14、osoftmsvc60。在周期譜計(jì)算中,我們發(fā)現(xiàn)譜相關(guān)運(yùn)算消耗了大量的時(shí)間,用C-MEX文件代替這一部分Matlab代碼可以大幅度減少耗時(shí)。C文件的計(jì)算子程序用來完成短時(shí)Fourier變換后的相關(guān)計(jì)算,double SpecR 為短時(shí)Fourier變換的實(shí)部,double SpecI為短時(shí)Fourier變換的虛部,DatLen為短時(shí)Fourier變換的長(zhǎng)度,double SR 為得到的周期譜的實(shí)部,double SI 為得到的周期譜的虛部,N1為搜索帶寬的起點(diǎn),N2為終點(diǎn),M為平滑次數(shù)。代碼如下:/* - C+ 源程序 -*/void spec_smth(double SR, double S
15、I, double SpecR, double SpecI, int M, int N1, int N2, int DatLen)int i,v; double tempR, tempI; int N = N2-N1; v=0; for(i=0;iN;i+) SRi = 0; SIi = 0; for(v=0;vM;v+) for(i=0;iSettings-Debug的Executable debug session中選擇matlab.exe作為Debug環(huán)境。按F7編譯通過后,按F5運(yùn)行,此時(shí)就會(huì)自動(dòng)啟動(dòng)Matlab環(huán)境,將SCFdll當(dāng)成普通函數(shù),在Matlab命令窗口中輸入數(shù)據(jù)STFT
16、, Len和命令SCF=SCFdll(STFT, Len)進(jìn)行驗(yàn)證。當(dāng)然,C-MEX文件SCFdll.dll必須在Matlab的搜索路徑中。還可以在C文件中設(shè)置斷點(diǎn),這為調(diào)試帶來了很大的方便。因?yàn)樯傻腃-MEX文件最終是在Matlab中作為build-in函數(shù)運(yùn)行,和普通函數(shù)沒有區(qū)別。2.1.4 總結(jié)測(cè)試選取的硬件條件為賽揚(yáng)2.4,運(yùn)行環(huán)境為Matlab6.5,用兩種不同的計(jì)算方法對(duì)不同長(zhǎng)度的數(shù)據(jù)點(diǎn)的周期譜計(jì)算進(jìn)行了計(jì)算時(shí)間的測(cè)試,測(cè)試結(jié)果如下表??梢钥闯?,C-MEX對(duì)周期譜計(jì)算進(jìn)行優(yōu)化的效果是明顯的,在本文描述的算法中可以將計(jì)算時(shí)間縮短為用m函數(shù)直接計(jì)算耗時(shí)的1/7左右。表一 m函數(shù)直接計(jì)
17、算和C-MEX優(yōu)化計(jì)算耗時(shí)比較(單位:秒)數(shù)據(jù)點(diǎn)數(shù)32k64k128k256k512km函數(shù)計(jì)算1.07803.500013.421084.1720354.6710C-MEX計(jì)算0.18700.82802.797012.547047.51602.2 Add-in 實(shí)例2.2.1 引言在眾多的Matlab與VC結(jié)合的方法中,Add-in方法簡(jiǎn)單,結(jié)構(gòu)明了。能在沒有Matlab環(huán)境的情況下(配置過程需要用到Matlab環(huán)境),將M文件轉(zhuǎn)化為C+文件,從而方便地在VC中調(diào)用,Add-in還提供打包功能,自動(dòng)提取庫文件,打包成zip文件后,在沒有安裝Matlab的機(jī)子上解壓縮,從而脫離Matlab環(huán)境
18、。更重要的是,可以邊修改m文件邊調(diào)試,至于書上介紹的用Matrix View觀察變量的做法,我沒能實(shí)現(xiàn),遺憾。但是VC的編譯器不能編譯Matlab的內(nèi)建函數(shù)的硬傷使得對(duì)很多算法的編譯不能得心應(yīng)手,比如該編譯器對(duì)FFT就無能為力。濾波器設(shè)計(jì)是信號(hào)處理、自動(dòng)控制等領(lǐng)域不可回避的問題,用VC等工具實(shí)現(xiàn)濾波器的設(shè)計(jì)相當(dāng)繁瑣,Matlab在這些方面又得天獨(dú)厚的優(yōu)勢(shì),所以可以考慮在VC中調(diào)用Matlab的濾波器設(shè)計(jì)工具箱,在VC中直接實(shí)現(xiàn)濾波器的設(shè)計(jì)。2.2.2 原理Add-in的原理是將M文件轉(zhuǎn)化為C+文件,經(jīng)過適當(dāng)?shù)腗atlab的Math C函數(shù)連接整合,在VC中調(diào)用。2.2.3 實(shí)現(xiàn)過程VC中Add
19、-in的設(shè)置步驟:(1)在Matlab命令行中鍵入mex setup(注意“mex”與“-”之間有空格)和mbuild -setup命令,按照給出的提示選擇MSVC6.0作為編譯器。配置好后,Matlab將提示Add-in組件已成功安裝到VC。此時(shí)別忘了在Matlab命令行中繼續(xù)鍵入cd(prefdir)和mccsavepath命令,將Matlab的路徑寫入VC中的某些文件。(2)在VC菜單中選擇Tools-Customize-Add-ins and Macro Files一欄,勾選MATLAB Add-in,然后關(guān)閉,此時(shí)下圖所示的Matlab add-in的工具條Toolbar1就會(huì)出現(xiàn)。
20、(3) 接下來是在VC的include設(shè)置搜索路徑。在Tools-Options-Directories的include搜索路徑中添加externinclude;因?yàn)橛玫搅薞C的編譯器,所以在lib搜索路徑中還要加入externlibwin32microsoftmsvc60。前期準(zhǔn)備到這里就完成了,配置一次,終身管用。下面用Add-in方法,調(diào)用Matlab的濾波器設(shè)計(jì)工具箱,做一個(gè)簡(jiǎn)單的低通濾波器設(shè)計(jì)。具體步驟如下:首先建立一個(gè)基于對(duì)話框的exe工程取名test2,修改對(duì)話框的界面如圖:N為濾波器的階數(shù),WN是歸一化帶寬,產(chǎn)生的濾波器系數(shù)在Filter coefficients編輯框內(nèi)顯示出
21、來。第二步是點(diǎn)擊Toolbar1內(nèi)的.m+,選擇添加myfilter.m文件,源代碼如下:function b, a = myfilter(n,wn)b, a = butter(n, wn);此時(shí)出現(xiàn)下圖所示的對(duì)話框,選擇默認(rèn),按OK后,自動(dòng)生成一大堆的m文件和C源和.h文件,有用的是myfilter.c和myfilter.h。前者是myfilter.m轉(zhuǎn)化而來的C文件,不過太繁瑣,只要看后者就可以知道他的功能和調(diào)用方法了。myfilter.h文件里有這幾行語句:extern void InitializeModule_myfilter(void);extern void TerminateM
22、odule_myfilter(void);extern _mexLocalFunctionTable _local_function_table_myfilter;extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn);extern void mlxMyfilter(int nlhs, mxArray * plhs, int nrhs, mxArray * prhs);其中extern void InitializeModule_myfilter(void);和extern void TerminateMod
23、ule_myfilter(void);明顯是初始化語句,extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn);為調(diào)用形式,具體實(shí)現(xiàn)在myfilter.h文件中,能把人看暈。第三步為Test按鈕的響應(yīng)函數(shù)void CTest2Dlg:OnButtonTest()添加代碼:double nOrder; / double nWn; / (01)double *pNum = NULL; / mxArray *mxArray_nOrder; / mxArray mxArray *mxArray_nWn; / mxAr
24、ray mxArray *mxArray_num; / mxArray UpdateData(true);nOrder = double(m_EditN);nWn = m_EditWN;mxArray_nOrder = mxCreateDoubleScalar(nOrder); / mxArray_nOrdermxArray_nWn = mxCreateDoubleScalar(nWn); / mxArray_nWnInitializeModule_myfilter(); / mxArray_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn
25、); / pNum = mxGetPr(mxArray_num); / double TerminateModule_myfilter(); / mlfMyfiltermxDestroyArray(mxArray_nOrder);mxDestroyArray(mxArray_nWn);mxDestroyArray(mxArray_num);mxCreateDoubleScalar、mxGetPr、mxDestroyArray等函數(shù)功能可以在Matlab的幫助了找到。代碼層次分明:mxArray_nWn = mxCreateDoubleScalar(nWn); 之前的語句用來實(shí)現(xiàn)參數(shù)的輸入;mx
26、Array_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn)完成濾波器的設(shè)計(jì);pNum = mxGetPr(mxArray_num);接收濾波器的系數(shù),最終的濾波器系數(shù)保存在指針pNum中,能在VC中使用。至于在實(shí)際應(yīng)用中具體怎么操作,已不在討論范圍之內(nèi)了。2.2.4 總結(jié)1. 可以邊修改m文件邊調(diào)試;2. 點(diǎn)擊Toolbar1上的包裹狀按鈕還可以實(shí)現(xiàn)程序的打包,將用到的一些庫文件發(fā)布成一個(gè)壓縮文件,在沒有安裝Matlab的機(jī)子上,解壓縮,程序照樣可以運(yùn)行,這一點(diǎn)很有誘惑力;3. 不能編譯Matlab的內(nèi)建函數(shù),圖形句柄不能用(不知道是我
27、沒調(diào)通還是真的不能用)??傮w來講,這種方法還是值得推薦的。2.3 Matcom 實(shí)例2.3.1 引言Matcom的特點(diǎn):Matcom是一個(gè)非常有用的m文件編譯器 (compiler),它有如下幾大優(yōu)點(diǎn):1.它提供了Matlab語言中m文件和其他語言的接口,使m文件可以編譯為脫離Matlab環(huán)境獨(dú)立執(zhí)行的可執(zhí)行程序,這樣不僅提高了代碼的復(fù)用率,執(zhí)行速度快,而且使純文本的。m文件轉(zhuǎn)化為二進(jìn)制的可執(zhí)行文件,增加了知識(shí)保護(hù)的安全性。2.它提供了近千個(gè)數(shù)學(xué)函數(shù)。對(duì)于其他高級(jí)語言編輯器來說,提供了一個(gè)豐富的數(shù)學(xué)庫,基本上在Matlab上能用的常用函數(shù)都可以在高級(jí)語言中調(diào)用,數(shù)學(xué)函數(shù)主要包括矩陣屬性生成函數(shù)
28、、數(shù)學(xué)函數(shù)、繪圖函數(shù)等。3.它可以編譯Matlab的大部分函數(shù),包括fft等,但是不知道為什么,不能編譯xcorr這樣的函數(shù),有可能是Matlab5.3時(shí)候的相關(guān)函數(shù)不是xcorr(待考證)。2.3.2 原理Matcom的工作原理:Matcom的矩陣運(yùn)算部分是基于一個(gè)名為Matrix的C+數(shù)學(xué)庫,這個(gè)庫提供了絕大多數(shù)的關(guān)于矩陣類、矩陣操作函數(shù)、數(shù)值計(jì)算函數(shù)、數(shù)學(xué)函數(shù)等的定義,在Matcom中是以lib目錄下的*.lib以及windows/system/ 對(duì)應(yīng)名稱的dll文件提供的。Matcom的另一大部分就是圖形部分,它是用一種非常流行的繪圖OCX控件TeeChart3.0來實(shí)現(xiàn)的,這種控件對(duì)
29、于一般的繪圖功能都可以實(shí)現(xiàn),但也存在一定缺陷。在Matcom4.5版本中使用的是TeeChart3.0。繪圖函數(shù)功能主要在lib文件和 window/system/ago*.dll中定義的。Matcom編譯m文件時(shí)先將m文件按照與Matcom的cpp庫的對(duì)應(yīng)關(guān)系,翻譯為cpp源代碼,然后用對(duì)應(yīng)版本的C編譯器將該CPP文件編譯為.exe或.dll文件,所以,在第一次運(yùn)行時(shí)讓指定C Compiler的路徑是必要的,否則將無法編譯。指定好的C Compiler的信息寫在Matcom/bin/matcom.ini文件中,這些都是在安裝的時(shí)候自動(dòng)完成的。2.3.3 實(shí)現(xiàn)過程按下列步驟完成Matcom a
30、dd-in的安裝:1.安裝Matcom,按提示選擇Visual C+的安裝路徑;2.運(yùn)行Visual C+,從菜單條中選擇Tools/Customize/Add-ins and Macro Files,選擇Browse,改變文件類型為Add-ins(.dll),選定D:Matcom45binmvcide.dll文件,確定;3.此時(shí),可以在VisualC+十的開發(fā)環(huán)境中看到如下圖所示工具欄,表明安裝成功。安裝完畢后,就可以實(shí)現(xiàn)m-cpp的轉(zhuǎn)化以及和Visual C+ 無縫連接了。本例的“測(cè)試”按鈕實(shí)現(xiàn)一個(gè)正弦波的產(chǎn)生及顯示。M文件 mcctest 的源代碼如下:function mcctestn
31、 = 256;x = sin(1:n/n*(16*pi);y = abs(fft(x);y = y(1:n/2);m i = max(y);plot(x);首先建立一個(gè)基于對(duì)話框工程matcom_test.exe點(diǎn)擊.m+后載入mcctest.m 文件,在資源管理器中生成一系列的cpp文件,而且?guī)旌瘮?shù)v4501v.lib自動(dòng)添加,方便快捷,一鍵搞定,如圖,我們會(huì)發(fā)現(xiàn)在g_mcctest.cpp出現(xiàn)如下代碼: #include matlib.h #pragma hdrstop #include mcctest.h unsigned int mlibpr=mt_set_MT(0); / 1 if
32、program is multithreaded, 0 otherwise. int main() begin_scope initM(MATCOM_VERSION); mcctest(); exitM(); return 0; end_scope 其中initM(MATCOM_VERSION); exitM(); 是用來初始化和退出Matcom調(diào)用的,mcctest(); 是運(yùn)算及畫圖主函數(shù)。值得說明的是,該文件只是當(dāng)VC的控制臺(tái)console方式下才運(yùn)行,但該文件給出的語法結(jié)構(gòu)卻可以原封不動(dòng)的Copy到其他的功能函數(shù)中。對(duì)測(cè)試按鈕對(duì)應(yīng)的函數(shù)添加代碼:void CMatcom_testDlg
33、:OnButton1()initM(MATCOM_VERSION); / 添加的mcctest(); / 添加的exitM(); / 添加的return; / 添加的 添加頭文件 #include matlib.h #include mcctest.h 運(yùn)行就可以出現(xiàn)(b)所示的效果?!坝?jì)算”按鈕用來實(shí)現(xiàn)周期譜的計(jì)算功能,參數(shù)設(shè)置中的參數(shù)除信號(hào)長(zhǎng)度外都是歸一化參數(shù)。M文件SCF_calculate_m.m實(shí)現(xiàn)周期譜的運(yùn)算,源代碼如下:function SCF = SCF_calculate_m(dat, DatLen , M, F0, B);% 各參數(shù)的意義略B = B/2;Spectrum
34、= fft(dat);SpecArray = Spectrum Spectrum;QN = round(B*DatLen); M = round(M*DatLen); NX0 = round(F0*DatLen); N1 = NX0-QN+1; N2 = NX0+QN; SCF = zeros(1,N2-N1+1);for v = 1:M SCF= SCF+SpecArray(v+N1:v+N2).*conj(SpecArray(DatLen+v-N1:-1:DatLen-N2+v); endplot(abs(SCF);% EOF對(duì)“計(jì)算”按鈕對(duì)應(yīng)的函數(shù)添加代碼:void CMatcom_te
35、stDlg:OnButton2() / TODO: Add your control notification handler code herelong ireadlength = m_nDatLen*1024;long li;float* SigI;short shtemp;/ = /CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,/Binary Files (*.bin)|*.bin|Data Files (*.dat)|*.dat|All Files (*.*)|*.*|,All Files (*.*)|*.*|,NULL);/*文件讀取*if(dlg.DoModal()=IDOK)CFile file; file.Open(dlg.GetPathName(),CFile:modeRead); /SigI = new float2*ireadlength;SigI = new floatireadlength;for(li=0; liireadlength; li+)file.Read(&shtemp,sizeof(short); / SigIli = shtemp; / file.Close();elseretur
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 零售業(yè)中的顧客安全保障措施
- DB3715T 69-2025研學(xué)旅游指導(dǎo)師服務(wù)規(guī)范
- 專業(yè)技術(shù)人才海外培訓(xùn)服務(wù)合同(版)
- 上海股權(quán)轉(zhuǎn)讓合同文本
- 二手房轉(zhuǎn)讓合同定金協(xié)議書范本
- 中外合資企業(yè)勞動(dòng)合同樣本
- 個(gè)人保證擔(dān)保融資合同協(xié)議
- NBA賽事中國區(qū)電視轉(zhuǎn)播合同
- 互利共贏投資合作合同
- 個(gè)人物流配送服務(wù)合同模板
- 關(guān)于防范遏制礦山領(lǐng)域重特大生產(chǎn)安全事故的硬措施課件
- 2025年中國成都餐飲業(yè)市場(chǎng)運(yùn)營態(tài)勢(shì)分析及投資前景預(yù)測(cè)報(bào)告
- 2024年xx縣第三小學(xué)安全工作管理制度匯編
- 項(xiàng)目合作備忘錄范文
- 婦產(chǎn)科醫(yī)生個(gè)人年終述職報(bào)告課件
- 《費(fèi)曼學(xué)習(xí)法》讀后感
- 趣味成語課程設(shè)計(jì)
- 鋼筋焊接工藝性試驗(yàn)方案
- 2024年四川省涼山州中考物理適應(yīng)性試卷(附答案解析)
- 幼兒園師資培訓(xùn)課件【區(qū)域進(jìn)階】科學(xué)區(qū)各年齡段目標(biāo)制定與投放材料:區(qū)域材料玩出新高度課件
- 人教版初中數(shù)學(xué)同步講義八年級(jí)上冊(cè)專題提升02 解分式方程與分式方程的實(shí)際應(yīng)用(30題)(原卷版)
評(píng)論
0/150
提交評(píng)論