在C++Builder中調(diào)用Matlab工具箱函數(shù),有兩種實(shí)現(xiàn)方式。一種是基于Matlab環(huán)境支持,通過必要的設(shè)置實(shí)現(xiàn);筆者在本刊上曾撰文對這種方式進(jìn)行了專門的闡述。另一種則是完全脫離Matlab環(huán)境,通過動(dòng)態(tài)連接庫方式實(shí)現(xiàn)對Matlab工具箱函數(shù)的調(diào)用,這可以通過一種開發(fā)平臺(tái)Mediva來實(shí)現(xiàn)。相對來說,前者的限制因素較多,而后者則較為方便靈活。
一、Mediva軟件平臺(tái)
Mediva是Mathtools公司推出的一種Matlab編譯開發(fā)軟件平臺(tái),提供對Matlab程序文件(M文件)的解釋執(zhí)行和開發(fā)環(huán)境支持。該軟件有為Borland C++、Visual Basic和Dephi等編程語言開發(fā)的不同版本,目前其版本已經(jīng)到了4.5版。軟件大小僅6.5M,可以通過訪問其站點(diǎn)www.mathtools.com免費(fèi)下載試用一個(gè)月。 Mediva軟件平臺(tái)本身的功能相當(dāng)強(qiáng)大,提供近千個(gè)Matlab的基本功能函數(shù),通過必要的設(shè)置,就可以直接實(shí)現(xiàn)與C++的混合編程,而不必再依賴Matlab;同時(shí),Mediva還提供編譯轉(zhuǎn)換功能,能夠?qū)atlab函數(shù)或編寫的Matlab程序轉(zhuǎn)換為C++形式的DLL,從而實(shí)現(xiàn)脫離Matlab環(huán)境對Matlab函數(shù)和過程的有效調(diào)用,這樣就有可能實(shí)現(xiàn)對Matlab強(qiáng)大的工具箱函數(shù)的利用。
Mediva的缺點(diǎn)是C++與Matlab混合編寫的應(yīng)用軟件必須攜帶必要的DLL,從而增大了軟件的體積(約4M),同時(shí)也不能對所有的Matlab函數(shù)提供支持,例如采用類庫進(jìn)行設(shè)計(jì)的部分函數(shù)。但盡管如此,對于控制系統(tǒng)計(jì)算機(jī)設(shè)計(jì)、分析的工作來說,Mediva仍不失為一個(gè)好的工具。
由于利用Mediva將Matlab工具箱函數(shù)轉(zhuǎn)換成DLL的內(nèi)容較多,限于篇幅本文在此僅給出對Matlab函數(shù)直接調(diào)用的實(shí)現(xiàn),而將另撰文闡述DLL的實(shí)現(xiàn)。
二、C++Builder直接調(diào)用Matlab函數(shù)
本文假設(shè)已經(jīng)安裝了Mediva軟件或已經(jīng)得到必要的兩個(gè)動(dòng)態(tài)連接庫mdv4300.dll和ago4300.dll。
Mediva提供的近千個(gè)Matlab基本功能函數(shù),都可以在C++Builder中直接調(diào)用。這些函數(shù)包括基本的操作、命令、I/O、線性代數(shù)、位圖、控制等,基本上可以滿足我們的一般需要。當(dāng)然其的優(yōu)點(diǎn)就是可以直接在C++Buider中直接調(diào)用而不必考慮安裝龐大的Matlab。
其實(shí)現(xiàn)方式和步驟如下:
1.Lib文件的生成
在Dos下用C++Builder中的Implib.exe,通過如下命令生成mdv4300.lib: implib mdv4300.lib mdv4300.dll
將上述兩個(gè)DLL文件和此Lib文件拷貝到當(dāng)前目錄下。
2.實(shí)現(xiàn)與Matlab的混合編程
Matlab.h包含了Mediva中所有類型、常量、函數(shù)的說明和定義,必須將此頭文件放于程序的第一行。Mediva給出的Matlab函數(shù)形式并不特殊,如繪線函數(shù)Plot,在Mediva中說明為:Mm DLLI plot(cMm varargin);varargin與Matlab 中的意義是一樣的,與輸入變量的個(gè)數(shù)相對應(yīng)。所有可以直接使用的函數(shù)都在Matlib.h頭文件中定義,而在mdv4300.dll中實(shí)現(xiàn)。
但在C++Builder中使用Mediva提供的Matlab函數(shù)的格式,與Matlab編程稍有不同,這主要體現(xiàn)在C++中必須進(jìn)行必要的說明上。例如我們要用繪線函數(shù)Plot來繪制數(shù)組x[100]的紅色圖線。在Matlab中調(diào)用為Plot(x,'r');在C++中調(diào)用則為:Plot(CL(x),TM("r")),其中CL是一個(gè)關(guān)鍵字,是多變量輸入時(shí)所必須使用的,用以指明調(diào)用的變量;而TM則指明,這是一個(gè)字符。
下面我們給出一個(gè)示例程序,其功能是對一個(gè)1024點(diǎn)的輸入數(shù)組進(jìn)行FFT 變換,并繪制變換后頻譜實(shí)部的火柴桿圖,最后將原數(shù)據(jù)和變換后的數(shù)據(jù)寫入數(shù)據(jù)文件中。
#include "matlib.h"
//必須包含的頭文件
#include < vcl.h >
#pragma hdrstop
#include "TryMatcomU.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(Tcomponent* Owner)
: Tform(Owner)
{
}
void __fastcall TForm1::Button1Click(Tobject *Sender)
{
int k=0;
initM(MATCOM_VERSION); //必須進(jìn)行的初始化
Mm cur1,cur2; //定義變量
cur1=zeros(128); cur2=zeros(128); //變量初始化
for(k=1;k< =128;k++)
cur1.r(k)=randM(); //生成一個(gè)隨機(jī)數(shù)列
figure(1);
plot(cur1);//圖形顯示該數(shù)列
cur2=fft(cur1,128); //做128點(diǎn)fft變換
figure(2); //繪制fft變換后實(shí)部的火柴桿圖,注意此處多變量輸入的格式
stem((CL(cur1),real(cur2),TM("r")));
fid=fopen(filename,mode,format) opens
exitM(); //退出調(diào)用
}
如果完全使用C++來實(shí)現(xiàn)本程序的工作,其代碼將超過300行!由此可以看出,C++Builder與Matlab函數(shù)的混合編程可以給我們帶來多么大的方便!
一、Mediva軟件平臺(tái)
Mediva是Mathtools公司推出的一種Matlab編譯開發(fā)軟件平臺(tái),提供對Matlab程序文件(M文件)的解釋執(zhí)行和開發(fā)環(huán)境支持。該軟件有為Borland C++、Visual Basic和Dephi等編程語言開發(fā)的不同版本,目前其版本已經(jīng)到了4.5版。軟件大小僅6.5M,可以通過訪問其站點(diǎn)www.mathtools.com免費(fèi)下載試用一個(gè)月。 Mediva軟件平臺(tái)本身的功能相當(dāng)強(qiáng)大,提供近千個(gè)Matlab的基本功能函數(shù),通過必要的設(shè)置,就可以直接實(shí)現(xiàn)與C++的混合編程,而不必再依賴Matlab;同時(shí),Mediva還提供編譯轉(zhuǎn)換功能,能夠?qū)atlab函數(shù)或編寫的Matlab程序轉(zhuǎn)換為C++形式的DLL,從而實(shí)現(xiàn)脫離Matlab環(huán)境對Matlab函數(shù)和過程的有效調(diào)用,這樣就有可能實(shí)現(xiàn)對Matlab強(qiáng)大的工具箱函數(shù)的利用。
Mediva的缺點(diǎn)是C++與Matlab混合編寫的應(yīng)用軟件必須攜帶必要的DLL,從而增大了軟件的體積(約4M),同時(shí)也不能對所有的Matlab函數(shù)提供支持,例如采用類庫進(jìn)行設(shè)計(jì)的部分函數(shù)。但盡管如此,對于控制系統(tǒng)計(jì)算機(jī)設(shè)計(jì)、分析的工作來說,Mediva仍不失為一個(gè)好的工具。
由于利用Mediva將Matlab工具箱函數(shù)轉(zhuǎn)換成DLL的內(nèi)容較多,限于篇幅本文在此僅給出對Matlab函數(shù)直接調(diào)用的實(shí)現(xiàn),而將另撰文闡述DLL的實(shí)現(xiàn)。
二、C++Builder直接調(diào)用Matlab函數(shù)
本文假設(shè)已經(jīng)安裝了Mediva軟件或已經(jīng)得到必要的兩個(gè)動(dòng)態(tài)連接庫mdv4300.dll和ago4300.dll。
Mediva提供的近千個(gè)Matlab基本功能函數(shù),都可以在C++Builder中直接調(diào)用。這些函數(shù)包括基本的操作、命令、I/O、線性代數(shù)、位圖、控制等,基本上可以滿足我們的一般需要。當(dāng)然其的優(yōu)點(diǎn)就是可以直接在C++Buider中直接調(diào)用而不必考慮安裝龐大的Matlab。
其實(shí)現(xiàn)方式和步驟如下:
1.Lib文件的生成
在Dos下用C++Builder中的Implib.exe,通過如下命令生成mdv4300.lib: implib mdv4300.lib mdv4300.dll
將上述兩個(gè)DLL文件和此Lib文件拷貝到當(dāng)前目錄下。
2.實(shí)現(xiàn)與Matlab的混合編程
Matlab.h包含了Mediva中所有類型、常量、函數(shù)的說明和定義,必須將此頭文件放于程序的第一行。Mediva給出的Matlab函數(shù)形式并不特殊,如繪線函數(shù)Plot,在Mediva中說明為:Mm DLLI plot(cMm varargin);varargin與Matlab 中的意義是一樣的,與輸入變量的個(gè)數(shù)相對應(yīng)。所有可以直接使用的函數(shù)都在Matlib.h頭文件中定義,而在mdv4300.dll中實(shí)現(xiàn)。
但在C++Builder中使用Mediva提供的Matlab函數(shù)的格式,與Matlab編程稍有不同,這主要體現(xiàn)在C++中必須進(jìn)行必要的說明上。例如我們要用繪線函數(shù)Plot來繪制數(shù)組x[100]的紅色圖線。在Matlab中調(diào)用為Plot(x,'r');在C++中調(diào)用則為:Plot(CL(x),TM("r")),其中CL是一個(gè)關(guān)鍵字,是多變量輸入時(shí)所必須使用的,用以指明調(diào)用的變量;而TM則指明,這是一個(gè)字符。
下面我們給出一個(gè)示例程序,其功能是對一個(gè)1024點(diǎn)的輸入數(shù)組進(jìn)行FFT 變換,并繪制變換后頻譜實(shí)部的火柴桿圖,最后將原數(shù)據(jù)和變換后的數(shù)據(jù)寫入數(shù)據(jù)文件中。
#include "matlib.h"
//必須包含的頭文件
#include < vcl.h >
#pragma hdrstop
#include "TryMatcomU.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(Tcomponent* Owner)
: Tform(Owner)
{
}
void __fastcall TForm1::Button1Click(Tobject *Sender)
{
int k=0;
initM(MATCOM_VERSION); //必須進(jìn)行的初始化
Mm cur1,cur2; //定義變量
cur1=zeros(128); cur2=zeros(128); //變量初始化
for(k=1;k< =128;k++)
cur1.r(k)=randM(); //生成一個(gè)隨機(jī)數(shù)列
figure(1);
plot(cur1);//圖形顯示該數(shù)列
cur2=fft(cur1,128); //做128點(diǎn)fft變換
figure(2); //繪制fft變換后實(shí)部的火柴桿圖,注意此處多變量輸入的格式
stem((CL(cur1),real(cur2),TM("r")));
fid=fopen(filename,mode,format) opens
exitM(); //退出調(diào)用
}
如果完全使用C++來實(shí)現(xiàn)本程序的工作,其代碼將超過300行!由此可以看出,C++Builder與Matlab函數(shù)的混合編程可以給我們帶來多么大的方便!

