声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 科学计算 matlab 查看内容

matlab 与delphi接口

2015-10-23 23:54| 发布者: aspen| 查看: 3730| 评论: 1|原作者: AaronSpark|来自: 声振论坛

摘要: 概述:本文阐述了如何利用Delphi灵活强大方便的编程能力和Matlab强大的科学计算能力,降低编写复杂算法的难度和时间,使Delphi算法程序的开发效率大大提高,收到事半功倍的效果。 关键字:Matlab、科学计算、接口 ...
概述:本文阐述了如何利用Delphi灵活强大方便的编程能力和Matlab强大的科学计算能力,降低编写复杂算法的难度和时间,使Delphi算法程序的开发效率大大提高,收到事半功倍的效果。

关键字:Matlab、科学计算、接口、数据交换

引 言:
最近在搞一个数字图像加密的课题,其中涉及到大量的矩阵及其他科学运算,在用Delphi实现时,可以想象在编写算法的时候遇到了大量的问题,所以提出了这样一个想法:能否将后台运算模块通过某种接口的方式交由其他成熟的科学计算软件处理,而用Delphi从事其前台开发,这样将大大降低编写复杂算法的难度和缩短开发周期。相信这也是广大开发人员在遇到大量科学计算时所急待的问题,在论坛上也屡有人问起,笔者参阅了大量资料后归纳整理了几种方案,希望对大家有益^_^

Delphi与MATLAB数据接口方案探讨

前言:
Delphi作为一种功能强大的编程工具,具有易学易用、开发效率高,界面制作美观方便等优点,因此被很多程序员所青睐。Pascal作为历史上第一种结构化的高级语言,在从事复杂算法编写方面也有着诸多优点,可是在软件开发快速运作的今天,用Pascal原始开发一些复杂的算法,不仅编译效率不高而且也影响开发进度,因此Delphi如何与科学计算软件相结合,从而高效地完成编程任务成为一个困扰很多程序员的问题。而Matlab就正是一种高效率的科学工程计算语言,它在矩阵运算、数值计算、数字信号处理、系统识别、自动控制、神经网络、图形显示等方面比其它语言有难以比拟的优势。将Delphi和Matlab相结合,利用Delphi灵活强大方便的编程能力,Matlab强大的科学计算能力就可以开发出功能强大、操作灵活的软件。
以下给出5类数据接口方案供大家参考:
(为了便于大家浏览,几种方案将分贴显示)

方案一 采用数据中转方式实现Delphi与Matlab交流.....................................2楼
方案二 基于DDE技术的动态数据交换..................................................3楼
方案三 创造ActiveX对象实现数据交流................................................4楼
方案四 利用动态链接库技术实现二者交流.............................................5楼
方案五 利用mideva编译脱离matlab环境的动态链接库(注:此方法笔者尚未成功).........6楼


发表评论

最新评论

引用 AaronSpark 2005-6-26 08:57
2003-8-18 21:25:18 方案四 利用动态链接库技术进行数据交流


一、基本思路

Matlab本身并没有提供与Delphi的应用程序接口,但是提供了基于win32平台的VC++应用程序接口,包括Matlab引擎(engine),C/C++函数库。可以利用Matlab与VC++的接口函数,通过matlab引擎进行指令处理和数据传递,编写出C++语言的动态连接库,作为Matlab与Delphi的接口,然后在Delphi中进行C++动态库函数的调用。Matlab引擎的C语言调用函数见表1。

表1:Matlab引擎的C语言调用函数
函数名 功  能
EngOpen 打开Matlab引擎
EngEvalString 在Matlab引擎中执行一条命令
EngPutArray 将数据放入Matlab引擎
EngGetArray 从Matlab引擎中取出数据
EngClose 关闭Matlab引擎

在使用表1所示的Matlab引擎函数时,要用到Matlab数组(mxArray),Matlab引擎利用这个数据类型来进行各种数据处理工作。Matlab中的各种变量,包括标量、矢量、矩阵、字符串等都是用这种Matlab数组来进行存储的。Matlab提供了C语言下的Matlab数组(mxArray)的格式,定义了它的数据结构。Delphi下没有对应的Matlab数组,但利用动态连接库可以巧妙地解决这个问题。


二、动态连接库的设计

在我们设计的软件中,要将Delphi中的数据送入Matlab进行分析,选择合适的处理函数后进行运算,然后将结果送回Delphi。为了实现上述目的,设计了相应的几个函数。这些函数都放在DpLab.dll动态连接库中。DpLab.dll的基本组成如下:
(1)头函数
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h" //在Matlab\extern\include下,将它拷入当前目录
engine *ep=NULL; //Matlab引擎,全局变量
mxArray *PA=NULL; //Matlab数组指针。可根据需要定义多个mxArray指针变量

(2)打开Matlab引擎函数:
extern"C" declspec(dllexport)int MatOpenEng(far char *cc)
{
if(ep) return 0;//如果已打开则退出
if(!(ep=engOpen(cc))) return -1;
else return 1;
}
如果Matlab安装在本地计算机上,字符串cc中的内容为“\0”,如果系统为客户机/服务器(Client/Server)的工作方式,Matlab安装在主机“host”上,可输入''\\host\Matlib''。

(3)关闭Matlab引擎的函数
extern"C" declspec(dllexport)int MatCloseEng(void)
{
if(ep)
{
if(PA) mxDestroyArray(PA);//释放PA
engClose(ep);
ep=NULL;
return1;
}
else return0;
}

(4)执行Matlab命令函数:
extern"C" declspec(dllexport)int MatExec(far char *cc)
{
if(!ep)return0;
engEvalString(ep,cc);//cc中放Matlab命令return 1;
}

(5)根据已知数据创建mxArray变量:
//注:cc:Matlab变量名 num:数据的个数 dd:已知数据
extern"C" declspec(dllexport)int MatCreateDoubleD(char *cc,int num,double dd[])
{
if(!ep) return 0;
if(num<1) return -1;
PA=mxCreatedoubleMatrix(1,num,mxREAL);
mxSetName(PA,fh[Getfh(cc)]);//指定Matlab中变量名,它必须是静态字符串!
memcpy((char *)mxGetPr(PA),(char *)dd,num * sizeof(double));
engPutArray(ep,PA);
return1;
}


(6)获取Matlab数据:
//注:cc:Matlab变量名 num:数据的个数 dd:返回数据
extern"C" declspec(dllexport)int MatGetdoubleData(char *cc,int num,double dd[])
{
mxArray result;
double pData;
int i;
if(!ep)return0;
if(num<1)return-1;
result=engGetArray(ep,fh[Getfh(cc)]);
if(result)
{  
pData=(double )mxGetData(result);  
for(i=0;i<num;i++) dd=pData;  
mxDestroyArray(result);  
return1;
}
return 0;
}
还可以根据需要定义其它一些函数如获取变量名函数intGetfh(charcc[])等等。这些函数写好以后,可以用VC进行编译,将编译好的动态连接库DpLab.dll复制到Windows\system下。


三、各种函数在Delphi中的运用

1、为了在Delphi中使用动态连接库函数,首先要对这些函数作如下声明:
function MatOpenEng(p:PChar):Integer;stdcall;external''DpLab.dll'';
function MatCloseEng:Integer;stdcall;external''DpLab.dll'';
function MatExec(p:PChar):Integer;stdcall;external''DpLab.dll'';
function MatCreateDoubleD(p:Pointer;num:Integer;dd:Array of double):Integer;stdcall;external''DpLab dll'';
function MatGetdoubleData(p:pointer;num:Integer;dd:Array of double):Integer;stdcall;external''DpLab dll'';
函数声明了以后,就可以方便地使用它们了。
打开Matlab引擎用:MatOpenEng(PChar(\0''));
关闭Matlab引擎用:MatCloseEng;

2、下面的程序给出了从Matlab中获取数据的方法,函数MatGetDoubleData通过变量cc指定Matlab中的数据变量名,该变量应是已经定义好的:
procedure TForm1Button2Click(Sender:Tobject);
var dd:Array[0..10] of double;cc:char;i:integer;
begin
cc:=''D'';//Matlab中的变量名
MatGetDoubleData(@cc,10,dd);
ListBox1.clear;//在一个列表框内显示读出的数据
for i:=0 to 4 do ListBox1.items.add(format(''%.2f,[dd]));
end;

  3、下面给出Delphi在Matlab中用sin(r)/r函数画出三维图形的程序,其余情况大家触类旁通吧^_^
procedure TForm1Button3Click(Sender:Tobject);
begin
MatExec(PChar(''x=-8: 5:8;''));
MatExec(PChar(''y=x'','';''));
MatExec(PChar(''X=ones(size(y))*x;''));
MatExec(PChar(''Y=y*ones(size(x));''));
MatExec(PChar(''R=sqrt(X.^2+Y.^2)+eps;''));
MatExec(PChar(''Z=sin(R)/R;''));
MatExec(PChar(''mesh(Z);''));
end;


四、方案总结

其实思路和上一种方案很像,不同的是是通过调用dll中的matlab应用程序接口指令实现数据传输,本方案所提供的动态连接库实际上是一个示范性的例子,根据实际需要还可以开发出功能更强大的函数,以满足不同应用场合的需要。就是要花费一定时间编写相关的dll咯^_^


2003-8-18 21:25:54 方案五 利用mideva编译脱离matlab环境的动态链接库


一、基本思路

如果你看过了以上的几种方案,就会发现它们都必需依赖于MATLAB环境,那么如何能够彻底脱离MATLAB环境呢?这也是我最近一直在研究的,但是天不随人意5555555555,虽然找到了相关资料可是却和实际情况相差太远。本来想等全部搞定之后再发这篇文章的,后来转念一想不如让大家共同研究,也许某位达人能参透其中奥妙。此方法是利用一个叫Mideva的软件,是Mathtools公司推出的一种Matlab编译开发软件平台(注:据笔者掌握的最新情况,Mathtools已经被Mathwork收购了),Mediva具有编译转换功能,能够将Matlab函数成编写的Matlab程序转换为c++形式的DLL,然后在Delphi中调用动态库函数,而不必再依赖Malab环境,前提是必须要有两个动态链接库mdv4300和ago4300。


二、编译步骤

利用Mideva平台实现Delphi与M文件混合编程步骤如下:
1、编写M文件
2、在Mideva中执行M文件
3、生成动态链接库(DLL)
4、Delphi中调用DLL函数


三、方案总结
如果真能实现,那将省去许多不必要的麻烦,可是笔者的问题在于用Mideva编译过后的DLL,Delphi无法识别-_-b,而且根本找不到mdv4300和ago4300两个动态链接库。如果那位仁兄能够成功,望请告知,不胜感激。

2003-8-18 21:26:46 后记:

Matlab和Delphi都是功能强大的计算机语言,利用接口技术可以充分利用Delphi高效、便捷的可视化开发环境和Matlab在数值计算、算法设计等领域的优势,提高程序的开发效率,大量节省在繁杂数学运算编程上花费的时间,能够快速开发出界面友好的算法程序和数值分析、数据处理软件。同时应该看到各种接口方案都有其不足之处,还有待大家共同研究。

我的EMAIL,欢迎大家共同探讨:yellowfish2001@sina.com

查看全部评论(1)

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-12 13:15 , Processed in 0.047984 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部