• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-48  評論-259  文章-1  trackbacks-0
             

            引言

                目前,Matlab廣泛的應(yīng)用于自動控制、數(shù)學(xué)運算、信號分析、圖像處理、財務(wù)分析等各行各業(yè)。MATLAB也存在著某些缺點:Matlab是一種解釋性語言,其特點是以矩陣為基本數(shù)據(jù)結(jié)構(gòu),導(dǎo)致其執(zhí)行效率相對CC+ +語言要低很多;因為Matlab程序不能脫離其環(huán)境運行,故不能直接用于商用軟件的開發(fā)。與此相反,VC++由于其豐富得人機界面,高效的執(zhí)行效率已經(jīng)成為基于Windows平臺下開發(fā)商業(yè)軟件的必備工具。然而,VC++對于復(fù)雜的數(shù)值運算就有點“力不從心”了。所以將VC++Matlab完美的結(jié)合,發(fā)揮各自的優(yōu)勢具有現(xiàn)實意義。自Matlab6.5版本開始,新推出來的Combuilder支持把用Matlab編寫的程序做成com組件,供其他語言調(diào)用。該方法實現(xiàn)簡單,通用性強,成為VCMatlab混合編程最有效的方法。

            1  VCMatlab混合編程的方法

            1.1 通過Matlab Engine方式

                Matlab Engine是指一組Matlab提供的接口函數(shù),支持C語言, Matlab Engine采用C/S(客戶機/服務(wù)器)模式,Matlab作為后臺服務(wù)器,而C程序作為前臺客戶機,通過Windows的動態(tài)控件與服務(wù)器通信,向Matlab Engine傳遞命令和數(shù)據(jù)信息,從Matlab Engine接受數(shù)據(jù)信息。用戶可以在前臺應(yīng)用程序中調(diào)用這些接口函數(shù),實現(xiàn)對Matlab Engine的控制。采用這種方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟件,而且執(zhí)行效率低,因此在實際應(yīng)用中不采用這種方法,在軟件開發(fā)中也不可行,這種模式只適合個人使用或做演示。

            1.2 直接調(diào)用MatlabC/C++數(shù)學(xué)函數(shù)庫

                Matlab中提供了可以供C/C++語言調(diào)用的C/C++數(shù)學(xué)函數(shù)庫,其中包含了大量用C/C++語言重新編寫的Matlab數(shù)學(xué)函數(shù),這些函數(shù)涉及到線形代數(shù)、數(shù)值分析、傅立葉變換、多項式計算、解微分方程等,并且函數(shù)庫中提供了大量各種矩陣操作函數(shù),在VC中可以直接使用這些函數(shù),通過這些函數(shù)可以在VC中方便的實現(xiàn)在Matlab中矩陣運算功能。用這種方法可以很靈活的調(diào)用Matlab來編寫應(yīng)用程序,但要求讀者對C/C++語言非常熟悉,并且這種模式不能包括所有的Matlab函數(shù),尤其是無法充分使用Matlab提供的詳盡的繪圖函數(shù)。

            1.3 Matlab自帶的Matlab Compiler

                Matlab Compiler的作用是將m文件轉(zhuǎn)化成C/C++代碼(也就是通常所用的mcc命令),這種源代碼需要用C/C++編譯器編譯連接成獨立應(yīng)用程序,在將m文件轉(zhuǎn)成獨立應(yīng)用程序的過程中生成的C/C++文件,原則上是可以被其它的C/C++代碼調(diào)用的,編譯器可以通過設(shè)置mcc命令的選項,將m文件編譯成動態(tài)鏈接庫文件、C/C++文件、可執(zhí)行文件等一系列文件。到matlab R21.1為止,Matlab Compilerm程序轉(zhuǎn)換成C/C++代碼功能有很多限制:

                ⑴不能轉(zhuǎn)換腳本m文件,只能轉(zhuǎn)換m函數(shù);

                ⑵不能使用matlab對象;

                ⑶不能用input或者eval操作matlab空間變量;

                ⑷不能動態(tài)地命名變量,然后用load或者save命令來操作;

                ⑸不能處理具有嵌套調(diào)用其他m文件的m文件;

                ⑹不能使用MATLAB內(nèi)聯(lián)函數(shù);

            1.4 使用matcom工具

                這是第三方控件,很小(8M),原本屬于mathtool公司,后來被Mathworks公司合并了,使用該工具可以將m腳本文件和m函數(shù)轉(zhuǎn)化成相同功能的C/C++文件,相比其它方法使用matcom具有如下優(yōu)點:

                ⑴轉(zhuǎn)換過程簡單(matcom工具自動實現(xiàn)),容易實現(xiàn);

                ⑵可以方便的生成動態(tài)鏈接庫文件(dll)和可執(zhí)行文件(exe);

                ⑶不僅可以轉(zhuǎn)換獨立的腳本文件,也可以轉(zhuǎn)換嵌套腳本文件;

                ⑷設(shè)置環(huán)境后,可以使用Matlab的工具箱函數(shù);

            matcom也有以下不足:

                ⑴對struct等類的支持有缺陷,對class數(shù)據(jù)類型;

                ⑵部分繪圖語句無法實現(xiàn)或得不到準確圖象,尤其是三維圖象;

                ⑶當(dāng)涉及到的復(fù)雜函數(shù)調(diào)用時嵌套的文件數(shù)量很多。

                因此在不涉及到三維做圖以及m文件不大的情況下推薦使用。

            1.5  使用MatlabCombuilde工具

                COMcomponent object module的簡稱,它是一種通用的對象接口,任何語言只要按照這種接口標準,就可以實現(xiàn)調(diào)用它。Matlab6.5新推出來的Combuilder就是把用Matlab編寫的程序做成com組件,供其他語言調(diào)用。該方法實現(xiàn)簡單,通用性強,而且?guī)缀蹩梢允褂?span>Matlab的任何函數(shù)(注意:不支持腳本文件,腳本文件使用時要改為函數(shù)文件),因此在程序較大、調(diào)用工具箱函數(shù)或調(diào)用函數(shù)較多時推薦使用,這也是Matlab公司推薦的使用方法。

            基于COM接口的MatlabVC混合編程實現(xiàn)FFT轉(zhuǎn)換

            2.1 創(chuàng)建Matlab源文件

                Matlab中實現(xiàn)FFT轉(zhuǎn)換只需要一個函數(shù)即可。

                (1) 新建M文件,在M文件中輸入以下兩條語句:

                Function FFT(X,Y) %實現(xiàn)FFT轉(zhuǎn)換。函數(shù)名為FFT,x為輸入?yún)?shù),y為輸出參數(shù)

                Y=fft(X);          %fft轉(zhuǎn)換實現(xiàn)函數(shù)

                (2)保存為FFT.m M文件。

            2.2  Matlab下創(chuàng)建COM組建

                (1)在matlab command window輸入如下命令:

                >>comtool



             

                (2)出現(xiàn)com編輯界面后,選擇File->New Project建立新工程testfft,并將FFT.m加入到新建工程中。

                (3)點擊Build->COM Object…生成COM組件。

                至此com組件已經(jīng)由matlab做好,默認的保存位置為:matlab安裝位置\work\component

            2.3  VC下調(diào)用COM組件

                (1)將testfft_idl.h testfft_idl_i.c文件拷貝到VC建立的工程目錄下。兩文件默認目錄為\work\component\src

                (2)將目錄/extern/include/下的mwcomtypes.h文件拷貝的VC建立的目錄下。

                (3)將上面三個文件加入VC工程:工程->添加工程->Files,選擇剛剛拷到目錄下的testfft_idl.h testfft_idl_i.c文件。

                (4) 為程序添加頭文件testfft_idl.h 、testfft_idl_i.cmwcomtypes.h

                (5)填寫調(diào)用COM組件代碼:

                if(FAILED(CoInitialize(NULL)))    //初始化調(diào)用com

                {

                      AfxMessageBox("unable to initialize COM");

                }

                Itestfft *st=NULL;

                HRESULT hr=CoCreateInstance(CLSID_testfft,NULL,CLSCTX_ALL,IID_Itestfft,(void **)&st);

                if(SUCCEEDED(hr))

                 {

                     VARIANT x,y;

                     VariantInit(&x);

                     VariantInit(&y);

                     x.vt=VT_I4;

                     x.lVal=4;

                st->fte(x,y);       //x為輸入?yún)?shù),y為輸出參數(shù)

                st->Release();

             }

                 else

             {

                AfxMessageBox("unsucceed");

             }   

                至此實現(xiàn)VC下調(diào)用COM組件實現(xiàn)FFT轉(zhuǎn)換。

            結(jié)論

                實踐表明用COM方法實現(xiàn)VCMatlab混合編程具有實現(xiàn)簡單、執(zhí)行效率高、幾乎支持所有的matlab函數(shù)、易移植等優(yōu)點。

            posted on 2007-06-11 12:59 星夢情緣 閱讀(4250) 評論(8)  編輯 收藏 引用 所屬分類: 關(guān)于編程

            評論:
            # re: 基于COM接口的VC++與MATLAB混合編程 2007-06-11 13:25 | 星夢情緣
            有用就頂,嘿嘿,
            希望有更好的東西可以互相交流  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2007-06-11 13:36 | 小艾
            好有用的文章哦,看來以后可以關(guān)注下MATLAB了,嘎嘎  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2007-06-12 09:02 | DxZ
            貌似現(xiàn)在matlab compiler已經(jīng)強多了。。還是脫離matlab環(huán)境來的爽啊。
            R21.1是什么版本。。  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2007-06-30 17:59 | 雅典娜
            請問你做過用matlab調(diào)用神經(jīng)網(wǎng)絡(luò)工具箱打包成com在vc中調(diào)用的程序嗎?我現(xiàn)在正在作,有些問題無法解決,我將編寫好,能夠運行的m文件(調(diào)用神經(jīng)網(wǎng)絡(luò)工具箱的m文件)編譯成com組件之后在vc里面調(diào)用總是提示組件中函數(shù)調(diào)用不成功,不知道是什么原因,如果可能,請給我回復(fù)一下,我的郵箱:mahuiyuok@163.com 謝謝。  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2008-08-20 09:18 | cherry
            vc中如何通過com組件調(diào)用哪個matlab神經(jīng)網(wǎng)絡(luò)工具箱?對于簡單的畫圖還能實現(xiàn),但用到神經(jīng)網(wǎng)絡(luò)工具箱就出錯了,什么原因?我的郵箱:282049028@qq.com  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2008-09-18 11:25 | 蔣方
            @雅典娜
            我也遇到了同樣的問題,就是當(dāng)一個函數(shù)的參數(shù)是一個.m文件名時,做成COM便不能執(zhí)行這個函數(shù),毛病出在哪里,望高手指教!??!我的QQ:727556719
            e-mail:gxjxjtumu@163.com
              回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程[未登錄] 2008-10-10 17:28 | 1
            MatlabX庫為VB,VC,Delphi,c#提供程序包接口,支持數(shù)學(xué)運算、線性代數(shù)、圖形處理和部分神經(jīng)網(wǎng)絡(luò)等功能,用于擴展 MATLAB 的功能和運行速度,可以作為獨立的工具使用,支持生成自己的獨立運行程序,不要求客戶電腦裝有matlab。 (可以另外加功能)

            在VB,VC,Delphi,c#中使用該數(shù)學(xué)工具包可避免重復(fù)性勞動,從而減少開發(fā)人員實現(xiàn)算法和界面設(shè)計的困難,可大大提高開發(fā)效率,對于解決工程問題是十分有意義的。MatlabX就是一個小的matlab。

            visual basic visual c++ delphi c# 調(diào)用 matlab 接口 神經(jīng)網(wǎng)絡(luò) 獨立運行 sim
            詳情
            http://matlabvbvc.blog.163.com/blog/static/27873611200731943916305/  回復(fù)  更多評論
              
            # re: 基于COM接口的VC++與MATLAB混合編程 2009-03-30 08:29 | didi
            我在vc中用一個對話框的兩個button分別調(diào)用兩個用combuild生成的com,總是報錯。我都是用
            CoInitialize(NULL);
            Idata *pImyclass;
            HRESULT hr=CoCreateInstance(CLSID_data,NULL,CLSCTX_ALL,IID_Idata,(void **)&pImyclass);
            hr=pImyclass->data();
            這樣的代碼。
            可是只用一個button調(diào)用一個用combuild生成的com就會成功。
            我想請教為什么和怎么修改。  回復(fù)  更多評論
              
            久久国产欧美日韩精品| 欧美精品一本久久男人的天堂| 久久久国产99久久国产一| 久久精品无码一区二区WWW| 婷婷久久久亚洲欧洲日产国码AV| 色综合久久久久网| 久久乐国产综合亚洲精品| 麻豆一区二区99久久久久| 国产精品成人精品久久久| 久久久亚洲欧洲日产国码二区| 日本精品一区二区久久久| 久久久青草青青亚洲国产免观| 久久久久久精品免费看SSS | 一本色道久久HEZYO无码| 狠狠色丁香婷综合久久| 亚洲欧美国产日韩综合久久| 中文字幕久久欲求不满| 97精品国产91久久久久久| 亚洲国产成人久久一区久久| 久久综合久久综合久久| 亚洲AV日韩精品久久久久久| 久久久久久国产a免费观看黄色大片| 久久中文字幕一区二区| 亚洲一区中文字幕久久| 久久99精品久久久久久久久久| 一本色道久久99一综合| 亚洲va久久久噜噜噜久久天堂| 亚洲精品tv久久久久| 久久伊人亚洲AV无码网站| 91久久精品国产成人久久| 久久精品一区二区国产| 久久精品蜜芽亚洲国产AV| 亚洲精品无码久久千人斩| 亚洲成色www久久网站夜月| 久久人做人爽一区二区三区| 久久精品国产日本波多野结衣 | 99久久这里只有精品| 乱亲女H秽乱长久久久| 久久偷看各类wc女厕嘘嘘| 亚洲欧洲精品成人久久奇米网 | 亚洲国产精品无码久久青草|