一 、Matlab本身并没有提供与Delphi的应用程序接口,但是提供了基于win32平台的VC++应用程序接口,包括Matlab引擎(engine),C/C++函数库。可以利用Matlab与VC++的接口函数,通过matlab引擎进行指令处理和数据传递,编写出C++语言的动态连接库,作为Matlab与Delphi的接口,然后在Delphi中进行C++动态库函数的调用。Matlab引擎的C语言调用函数如下: 函数名 功 能 EngOpen 打开Matlab引擎 EngEvalString 在Matlab引擎中执行一条命令 EngPutArray 将数据放入Matlab引擎 EngGetArray 从Matlab引擎中取出数据 EngClose 关闭Matlab引擎在使用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[i]=pData[i]; mxDestroyArray(result); return1; } return 0; }剩下的自己发挥...其实,就是要花费一定时间编写相关的dll