副标题#e#
Borland C++Builder是一种新颖的可视化编程语言。在工程应用中,我们一般用C++Builder语言编写应用措施,实现交互界面、数据收罗和端口操纵等,但C++Builder在数值处理惩罚阐明和算法东西等方面,其效率远远低于Matlab语言。在精确利便地绘制数据图形方面,Matlab语言更具有无可相比的优势。另外,Matlab还提供成果强大的东西箱。但Matlab的缺点是不能实现端口操纵和及时节制。因此,若能将两者团结运用,实现优势互补,将得到极大的效益。
本文团结实际先容了应用Borland C++Builder3.0开拓的Windos应用措施中,对Matlab的挪用要领。
一、C++Builder挪用Matlab的实现方案
1. 实现思路
在高版本的Matlab中(如Matlab V4.2)提供了DDE接口,用户可以通过Windows的DDE通信基制实现外部挪用。这种实现方法较量简朴,但将增大主措施代码,影响运行速度。
在Windows系统中,DLL是一种很出格的可执行文件,可以被多个Windows应用措施同时会见,具有牢靠的共享数据段。该数据段的数据在DLL被Windows下载前会一直保存在内存中,因此可以通过DLL实现用户措施与Matlab之间的数据传输和函数挪用。
详细地说,就是操作Matlab的32位动态毗连库(DLL),生成相应的可以被C++Builder挪用的DLL,用来提供二者之间的根基支撑情况。只需在用户措施中加载该DLL,即可实现其数据段的共享。然后在用户措施中操纵DLL数据段的数据,并通过某种方法在用户措施中使Matlab执行该DLL,就可实现用户措施对Matlab的挪用。其形式可以是殽杂编程或函数挪用,很是利便而高效。
2. 实现方法
Matlab提供了可外部毗连的DLL文件,通过将其转换为相应的Lib文件,并加以须要的配置,就可以在C++Builder中直接举办Matlab函数挪用,实现C++ Builder语言与Matlab语言的殽杂编程。
#p#副标题#e#
(1) 运行情况要求
由于Matlab提供的是32位的DLL。其运行情况要求是Matlab V4.2或更高版本。C++Builder可以举办32位编程,这里我们回收的是V3.0版本。
(2) C++Builder下LIB文件的生成
Matlab提供的Def文件答允用户通过Implib呼吁生成相应的Lib文件。其呼吁名目为
Implib ???.lib ???.def
在<matlab>\extern\include目次下,提供了如下三个.Def文件:
_libeng.def,_libmat.def,_libmx.def
通过上述呼吁可以生成相应的三个Lib文件。这些Lib文碱中包括了可外部挪用的Matlab函数的须要信息。
二、实现计较和画图
为清楚起见,通过一个简朴的CBuilder例程举办说明。该实例通过挪用Matlab实现矩阵运算并绘制图形,来演示C++Builder对Matlab的挪用。
在C++Builder编辑情况中,成立一个新的窗体MyForm,并安排一个按钮Demo。将工程文件定名为Try.prj,其主函数为try.cpp。在主函数中,我们将利用一个实现Matlab挪用的子函数DemoMatlab,作为按钮Demo的响应事件。其源代码如下:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TMyForm *MyForm;
__fastcall TMyForm::TMyForm(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TMyForm::DemoClick(TObject *Sender)
{
DemoMatlab(); //演示Matlab语言挪用
}
为了挪用Matlab中的函数,必需举办须要的配置,将包括这些函数的文件插手工程文件Try.prj。以下是操纵进程:
1. 在头文件中插手Engine.h。其包括了启动Matlab挪用和封锁的函数声明。
2. 打开Project|Option…对话框,点击Directories/Conditionals。
● 在Include Path中,插手目次路径<matlab>\extern\include,该路径包括了engine.h和matlab.h等有用的头文件。
● 在Library Path中,插手<matlab>\bin和<matlab>\extern\include。这两个目次路径包括了可外部挪用的DLL和LIB文件。
3. 点选Project|Add to Project…对话框,插手如下库文件:
_libeng.lib,_libmat.lib和_libmx.lib。
在举办了这些须要的配置之后,我们就可以选用适当的函数来实现方针。 以下是子函数DemoMatlab的措施代码。
void DemoMatlab
{
Engine *eng;
//界说Matlab引擎
char buffer[200]; //界说数据缓冲区
int array[6]={1,2,3,4,5,6};
mxArray *S = NULL, *T = NULL;
engOpen(NULL); //打开MATLAB 引擎 ---1
S= mxCreateDoubleMatrix(1,6, mxREAL);
// 发生矩阵变量
mxSetName(S, "S");
memcpy((char*) mxGetPr(S),(char *) array, 6*sizeof(int));
engPutArray(eng, S); //将变量X置入Matlab的事情空间
engEvalString(eng, "T = S/S.^2;"); //计较
engEvalString(eng, "plot(S, T);"); //绘制图形
…… ……
engOutputBuffer(eng, buffer, 200); //获取Matlab输出
T = engGetArray(eng, "T"); //得到计较功效----2
engClose(eng); //封锁Matlab引擎,竣事挪用
mxDestroyArray(S); //释放变量
mxDestroyArray(T);
}
若还需要执行其他成果和任务,那么凭据上面先容的要领,举办变量声明后,在1、2处加写需要的语句即可。