六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Matlab與VC集成

[摘要]◆ 上海大學(xué)通信與信息工程學(xué)院 楊高波 Matlab是一個(gè)具有強(qiáng)大的矩陣運(yùn)算、數(shù)據(jù)處理和圖形顯示功能的軟件,其輸出結(jié)果可視化,編程效率極高,極少的代碼即可實(shí)現(xiàn)復(fù)雜的運(yùn)行,然而其邊解釋邊執(zhí)行,運(yùn)算效率...
◆ 上海大學(xué)通信與信息工程學(xué)院 楊高波

Matlab是一個(gè)具有強(qiáng)大的矩陣運(yùn)算、數(shù)據(jù)處理和圖形顯示功能的軟件,其輸出結(jié)果可視化,編程效率極高,極少的代碼即可實(shí)現(xiàn)復(fù)雜的運(yùn)行,然而其邊解釋邊執(zhí)行,運(yùn)算效率較低,實(shí)現(xiàn)相同功能的代碼跟其他編程平臺(tái)相比運(yùn)行時(shí)間相對(duì)較長(zhǎng),且不適合作為通用的編程平臺(tái)。因此,許多Matlab的應(yīng)用程序需要使用諸如VC之類的通用編程平臺(tái),實(shí)現(xiàn)Matlab與VC的混合編程,這樣有助于發(fā)揮Matlab和VC的各自優(yōu)勢(shì)。

集成的幾種實(shí)現(xiàn)方法

為了實(shí)現(xiàn)混合編程,Matlab 5.0以后版本自帶了C語(yǔ)言編譯器(Compiler), 可以將M文件轉(zhuǎn)換為C-MEX或C/C++程序。根據(jù)Matlab是否運(yùn)行,一般將Matlab與VC混合編程分為兩大類:Matlab在后臺(tái)運(yùn)行和可以脫離Matlab環(huán)境運(yùn)行。

1.Matlab引擎(Engine)采用客戶機(jī)/服務(wù)器(Client/Server)的計(jì)算方式,通過(guò)Windows的ActivcX通道和Matlab接口。在具體的應(yīng)用中,VC的程序作為前端客戶機(jī),通過(guò)調(diào)用Matlab Engine在后臺(tái)與Matlab服務(wù)器建立連接,實(shí)現(xiàn)動(dòng)態(tài)通信。這種方法實(shí)現(xiàn)較為簡(jiǎn)單,不要求連接整個(gè)Matlab,只需要嵌入必要的Matlab Engine庫(kù),可大大地節(jié)省系統(tǒng)資源,但這種Matlab在后臺(tái)運(yùn)行,運(yùn)行效率低下。

2.Mideva是Mathtools公司推出的一種Matlab集成編譯開(kāi)發(fā)平臺(tái),提供對(duì)Matlab程序文件(M文件)的解釋執(zhí)行和開(kāi)發(fā)環(huán)境支持。經(jīng)過(guò)簡(jiǎn)單設(shè)置后Mideva可以將M源文件轉(zhuǎn)換為C/C++,然后添加到MSVC、C++ Builder的工程中。

3. 另一種方法是先利用Mideva直接生成EXE文件(方法是啟動(dòng)Mideva,在菜單“File->Compile to exe”中, 選出需要轉(zhuǎn)換的M文件),然后在VC中通過(guò)Shell調(diào)用,常見(jiàn)的外部函數(shù)有shellexec()或winexec()。這種方法簡(jiǎn)單方便,但運(yùn)行時(shí)出現(xiàn)一個(gè)控制臺(tái)窗口,而且由于VC和Matlab之間不能交互,通用性差,僅適用于VC中調(diào)用Matlab實(shí)現(xiàn)圖形顯示的場(chǎng)合。

4. 最新也是最方便的方法是通過(guò)Matlab 6.0 Add-in實(shí)現(xiàn)Matlab與VC的混合編程。

以上方法1需要Matlab在后臺(tái)運(yùn)行,方法2、3、4可以脫離Matlab環(huán)境運(yùn)行。

Matlab Add-in

Matlab 6.0以后版本對(duì)其Compiler作了較大的改進(jìn),其支持更多的數(shù)據(jù)類型,更強(qiáng)的優(yōu)化功能,更為重要的是其Matlab Add-in提供了一個(gè)Matlab和VC直接集成的途徑。它具有一些新的特征:快速集成M文件到C++工程中,創(chuàng)建獨(dú)立的 C/C++應(yīng)用程序或C MEX DLL;通過(guò)M文件創(chuàng)建共享庫(kù)或MEX文件;內(nèi)含Visual Matrix Viewer,調(diào)試過(guò)程中可以查看矩陣變量的值; 直接修改M源文件而不是修改生成的C/C++文件;方便快捷地打包應(yīng)用程序等。

Matlab Add-in的安裝:

1. 啟動(dòng)Matlab,運(yùn)行“mex-setup”,按照菜單提示選取MSVC。它將配置MEX使用MSVC為默認(rèn)的編譯器(創(chuàng)建C-MEX文件必需),并安裝Matlab Add-in所需文件到MSVC目錄。

2. 在Matlab環(huán)境下運(yùn)行“mbuild-setup”, 按提示選取MSVC。它將配置使用MSVC為默認(rèn)的編譯器(創(chuàng)建獨(dú)立應(yīng)用程序必需),并安裝Matlab Add-in所需的Matlab Compiler和C/C++數(shù)學(xué)庫(kù)文件到MSVC目錄。

3. 在Matlab環(huán)境下運(yùn)行“cd(prefdir)”和“mccsavepath”。它將保存當(dāng)前Matlab路徑到mccpath文件中,這是因?yàn)镸atlab Add-in脫離Matlab運(yùn)行,否則它無(wú)從知道Matlab路徑。

4. 在MSVC環(huán)境中配置Matlab Add-in,方法是:從菜單“Tools -> Customize”選擇“Add-ins and Macro Files”選項(xiàng)卡,選中“Matlab Add-in”, 點(diǎn)擊“Close”。MSVC工具欄出現(xiàn)Matlab Add-in圖標(biāo),以后每次啟動(dòng)VC,自動(dòng)加載Matlab Add-in。

5. 配置Windows系統(tǒng)。在Windows 95/98系統(tǒng)下,找到config.sys, 添加一行:shell= c:\ command.com /e:32768 /p(Windows ME有所不同,需設(shè)置Conagent.exe的屬性Memory選項(xiàng)卡的Initial Environment值為4096)。從表面看,VC的環(huán)境設(shè)置也是步驟較多,但只需設(shè)置一次。

程序示例

下面以創(chuàng)建一個(gè)Standalone程序?yàn)槔唧w說(shuō)明。啟動(dòng)MSVC,打開(kāi)“File->New”菜單,選擇Project,選擇“Matlab Project Wizard”, Project Name命名為Mytest, 點(diǎn)擊Next,你可以選擇所生成的應(yīng)用程序的類型:Windows Console EXE、C-MEX DLL、M-MEX DLL、Shared M-DLL; C程序還是C++程序;選取Debug、Release模式;選擇是否生成Main函數(shù);是否需要支持圖形。這里選擇生成C++程序,其余采取默認(rèn)設(shè)置,點(diǎn)擊“Finish”,出現(xiàn)對(duì)話框要求選擇添加到工程中的M源文件,選擇文件testplot.m后,這時(shí)你可以看到MSVC調(diào)用MCC生成一個(gè)混合M文件和C的工程。在“File View”選項(xiàng)卡中可以看到添加的M文件和自動(dòng)生成的C++文件。

這時(shí)大功告成,即可按F7編譯后按F5運(yùn)行了,運(yùn)行結(jié)果如下圖所示。



程序運(yùn)行結(jié)果

這里用到的testplot.m內(nèi)容如下(先在Matlab里編輯好):

function mytest()

t=0: 0.05*pi: 2*pi;

y=sin(t);

plot(t,y,‘b*’);

可以通過(guò)雙擊Matlab M-files文件夾下testplot.m打開(kāi)觀察。生成的testplot.cpp代碼如下(略有刪節(jié)):

// MATLAB Compiler: 2.1 Date: Sat Nov 03 16:37:08 2001

#include “testplot.hpp”

#include “l(fā)ibmatlbm.hpp”

static double _array0_[41] = { 0.0,.157,....};

//自動(dòng)生成的數(shù)組

void InitializeModule_testplot() {

}

void TerminateModule_testplot() {

}

static void Mtestplot();

_mexLocalFunctionTable _local_function_

table_testplot = { 0, (mexFunctionTableEntry *)NULL };

void mlxTestplot(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) {

MW_BEGIN_MLX();

{

if (nlhs > 0) {

error(mwArray(“Run-time Error: File: testplot Line: 1 Column: 1 The function \‘testplot\’was called with more than the declared number of outputs (0). ”));

}

if (nrhs > 0) {

error(mwArray(“Run-time Error: File: testplot Line: 1 Column: 1 The function \‘testplot\’ was called with more than the declared number of inputs (0).”));

}

Mtestplot();

}

MW_END_MLX();

}

#line 1 “D:\\ygbtest\\testplot.m”

static void Mtestplot() {

#line 1 “D:\\ygbtest\\testplot.m”

mclMlineEnterFunction(“D:\\ygbtest\\testplot

.m”, “testplot”)

#line 1 “D:\\ygbtest\\testplot.m”

mwLocalFunctionTable save_local_

function_table_(&_local_function_table_testplot);

#line 1 “D:\\ygbtest\\testplot.m”

mwArray ans(mclGetUninitializedArray());

#line 1 “D:\\ygbtest\\testplot.m”

mwArray y(mclGetUninitializedArray());

#line 1 “D:\\ygbtest\\testplot.m”

mwArray t(mclGetUninitializedArray());

// t=0: 0.05*pi: 2*pi;

//

#line 2 “D:\\ygbtest\\testplot.m”

mclMline(2);

#line 2 “D:\\ygbtest\\testplot.m”

t = mwArray(1, 41, _array0_, (double *)NULL);

//

// y=sin(t);

//

#line 3 “D:\\ygbtest\\testplot.m”

mclMline(3);

#line 3 “D:\\ygbtest\\testplot.m”

y = sin(mwVv(t,“t”));

//

// plot(t,y,‘b*’);

//

#line 4 “D:\\ygbtest\\testplot.m”

mclMline(4);

#line 4 “D:\\ygbtest\\testplot.m”

ans.EqAns(Nplot(0, mwVarargin(mwVv(t, “t”), mwVv(y, “y”), “b*”)));

#line 4 “D:\\ygbtest\\testplot.m”

mclMlineExitFunction();

#line 4 “D:\\ygbtest\\testplot.m”

}

自動(dòng)生成的testplot_mainhg.cpp代碼如下:

#include “matlab.hpp”

//加入Matlab頭文件

#include “l(fā)ibsglinit.hpp”

#include “testplot.hpp”

//加入應(yīng)用程序頭文件

static mexFunctionTableEntry function_table[1] = { { “testplot”, mlxTestplot, 0, 0, &_local_function_table_testplot } };

static _mexcppInitTermTableEntry init_term_table[1] = { { InitializeModule_testplot, TerminateModule_testplot } };

static _mexcpp_information _main_info = { 1, 1, function_table, 0, NULL, 0, NULL, 1, init_term_table };

可以看到?jīng)]有添加一句C/C++代碼,即生成了一個(gè)Matlab的Standalone應(yīng)用程序(是不是太容易啦)。需要注意兩點(diǎn): 一是添加到MSVC工程的文件應(yīng)當(dāng)為一個(gè)函數(shù)文件,而不能是一個(gè)Script文件,否則會(huì)出現(xiàn)錯(cuò)誤提示; 二是最好不要修改生成的C/C++代碼,如果需要改動(dòng),可以通過(guò)在MSVC工作區(qū)中直接修改M文件(無(wú)須在Matlab環(huán)境中),重新編譯即可。你可以通過(guò)在M文件中設(shè)置斷點(diǎn),在運(yùn)行中通過(guò)Matrix Viewer觀察Matlab變量的值。

目前通過(guò)Add-in實(shí)現(xiàn)Matlab與VC的混合編程也有一定的不足:如目前并不支持所有的Matlab的函數(shù);生成的程序代碼有些繁雜等。估計(jì)Matlab 6.0以后的版本在這方面肯定有所改進(jìn)的。

結(jié) 論

Matlab Add-in提供了一種實(shí)現(xiàn)Matlab和VC混合編程的直接集成的途徑,通過(guò)它可以很方便地生成Matlab和VC的混合程序。在圖像處理等需要大量計(jì)算的工程應(yīng)用場(chǎng)合有廣泛的應(yīng)用價(jià)值。


標(biāo)簽:Matlab與VC集成 
主站蜘蛛池模板: 四虎看黄 | 亚洲最色网站 | 任我爽精品视频在线播放 | 午夜国产福利在线 | 性欧美大战久久久久久久 | 日韩欧美三级在线 | 日本a级片免费观看 | 青青青青手机在线观看 | 中文字幕视频不卡 | 日韩一级片免费看 | 欧美整片第一页 | 日本在线观看视频 | 午夜特片网 | 天天做天天爱天天干 | 色天使色婷婷丁香久久综合 | 我想看一级播放片一级的 | 色天使久久 | 日韩亚洲欧美一区 | 四虎影院海外永久 | 青久在线| 欧美又粗又硬又大久久久 | 亚洲精品国产精品乱码不卞 | 亚洲精品视频免费观看 | 亚洲免费网址 | 亚洲欧洲视频在线 | 日韩一级淫片 | 息与子外出中文字幕 | 四方色播 | 日本大学生免费一级一片 | 天天天夜夜夜 | 色综合久久98天天综合 | 亚洲成年www | 日韩在线操 | 色综合天天射 | 手机看片自拍日韩日韩高清 | 午夜91| 午夜网站在线观看免费网址免费 | 夜夜夜夜夜夜夜工噜噜噜 | 中文字幕欧美在线观看 | 日日噜噜噜噜人人爽亚洲精品 | 一级黄色在线视频 |