当前位置: 主页 > 生物技术 > 软件工具与数据库 > 编程与数值计算

Delphi与MATLAB数据接口方案探讨

2026-04-05 11:49 bioguider Internet 阅读 0
核心摘要: 采用数据中转方式实现Delphi与MATLAB数据交流 一 基本思路 MATLAB数据输入方法 MATLAB输入数据的方法很多 其中利用M文件直接把数据按元素列表方式引入MATLAB工作内存的方法 不

采用数据中转方式实现Delphi与MATLAB数据交流


一、基本思路

MATLAB数据输入方法

MATLAB输入数据的方法很多,其中利用M文件直接把数据按元素列表方式引入MATLAB工作内存的方法,不仅语法简单,而且运行时只要输入文件名,MATLAB就会自动按顺序执行M文件中的语句。

MATLAB数据输出方法

为了便于与Delphi应用程序接口,可以利用MATLAB的指令 save 输出数据。例如:

matlab
save outfile.dat x y -ascii -double

该指令可将变量 x 和 y 以16位ASCII码形式存入 outfile.dat 文件。

核心思路

基于上述MATLAB数据输入、输出的方法,可以利用M文件作为数据中转,实现Delphi和MATLAB的数据交换。

注意事项

(1)矩阵数据的保存

由于MATLAB的基本数据单位是矩阵,在Delphi应用程序中只能通过文件变量,将参与运算的数据输出成M文本文件,以创建和保存矩阵数据。

(2)MATLAB的启动

Delphi应用程序在前台运行,因此在应用程序中调用Windows函数 WinExec,即可执行 Matlab.exe

(3)MATLAB后台运作

M文件只有在MATLAB集成环境中才能被识别和自动执行。根据后台要求,不能显式进入MATLAB集成环境。考虑到MATLAB环境变量由 matlabrc.m 文件定义,可以通过对该文件的修改(将MATLAB要完成的输入数据、进行计算、输出数据过程编写成M文件,加入 matlabrc.m 中),从而实现MATLAB的后台运作。


二、Delphi如何将数据传递给MATLAB

以下通过一个具体例子进行说明

示例要求

进行矩阵运算:(b' * b)^(-1) * b' * y'

其中:

  • b 是 t × 2 矩阵

  • y 是 1 × t 矩阵

Delphi实现代码

在Delphi应用程序中,采用以下程序段将参与运算的矩阵 by 保存成M文件,使MATLAB可以通过执行相应的M文件获得这些矩阵。

变量说明

  • fbfy:事先定义好的 textfile 类型文件变量

  • b[i,j]y[i]:事先定义好的数组变量

  • 'c:\matlabfile\delphiout\b.m':保存矩阵b的M文件路径及文件名

  • 'c:\matlabfile\delphiout\y.m':保存矩阵y的M文件路径及文件名

创建保存矩阵b的M文件

pascal
// 注:在MATLAB中整个输入矩阵必须以"[]"为其首尾,
// 矩阵的行与行之间必须用分号";"或回车分隔,
// 矩阵元素必须由逗号","或空格分隔。

assign(fb, 'c:\matlabfile\delphiout\b.m');
Rewrite(fb);
write(fb, 'b=[');

for i := 0 to t-2 do
    for j := 0 to 1 do
    begin
        Write(fb, b[i, j]);
        if j < 1 then 
            Write(fb, ',')
        else
            if (i < t-2) and (i = 1) then 
                write(fb, ';')
            else 
                write(fb, ']');
    end;

CloseFile(fb);

创建保存矩阵y的M文件

pascal
assign(fy, 'c:\matlabfile\delphiout\y.m');
Rewrite(fy);
write(fy, 'y=[');

for i := 1 to t-1 do 
    if i < t-1 then 
        write(fy, y[i], ',')
    else 
        write(fy, y[i], ']');

CloseFile(fy);

三、MATLAB如何接收数据并进行计算

背景说明

由于M文件只有在MATLAB集成环境中才能被识别和自动执行,而根据后台运作的要求不能显式进入MATLAB集成环境。但可以通过对 matlabrc.m 文件的修改,将MATLAB要完成的操作编写成M文件,加入 matlabrc.m 中。

示例M文件编写

按照前面例题的计算要求,编写MATLAB接收数据、进行计算、数据输出的M文件,取名为 C:\matlabfile\Mymatlabfile.m

步骤1:创建Mymatlabfile.m

用记事本输入以下代码,保存在自己的目录(如 C:\matlabfile\)下:

matlab
% 保存矩阵b的M文件
delphiout\b

% 保存矩阵y的M文件
delphiout\y

% 执行矩阵运算:m = (b' * b)^(-1) * b' * y'
m = ((b') * b') * (y')

% 输出计算结果
save c:\matlabfile\matlaboutfile.dat m -ascii -double

% 退出MATLAB
quit

步骤2:修改matlabrc.m

  1. 打开 matlabrc.m,将其保存为一个备份文件 matlabrcbak.m

  2. 对原文件进行编辑,将下列语句加在文件最后

matlab
if exist('c:\matlabfile\Mymatlabfile.m')
    Mymatlabfile
end

步骤3:启动MATLAB

完成上述内容后,只要在应用程序中启动MATLAB,就会自动完成相应操作。


四、在Delphi中如何启动MATLAB

将前面步骤处理完后,可以用以下程序隐式启动MATLAB:

pascal
copyfile('c:\dsm\matlabfile\Mymatlabrc.m', 
         'c:\matlab\toolbox\local\matlabrc.m', 
         false);

winexec('c:\matlab\bin\matlab.exe', SW_MINIMIZE);

五、Delphi如何接收MATLAB输出结果

结果输出方式

MATLAB将计算结果通过以下指令输出:

matlab
save c:\matlabfile\matlaboutfile.dat m -ascii -double

Delphi读取结果

通过以下程序获取计算结果,并将结果(double类型变量 mid)放进数组 a[i] 中:

pascal
// Fa为textfile类型变量

if FileExists('c:\matlabfile\matlaboutfile.dat') then
    AssignFile(Fa, 'c:\matlabfile\matlaboutfile.dat');

Reset(Fa);
i := 0;

while not Eof(Fa) do
begin
    read(Fa, mid);
    a[i] := mid;
    i := i + 1;
end;

closefile(Fa);

六、还原MATLAB原始环境参数

在应用上述步骤完成接口后,还需要在应用程序中添加以下代码,以还原MATLAB原始环境参数设定

pascal
copyfile('c:\matlabfile\matlabrcbak.m', 
         'c:\matlab\toolbox\local\matlabrc.m', 
         false);

方案总结

 
 
步骤 内容 关键技术点
1 Delphi数据导出 将矩阵数据写入M文件
2 MATLAB启动 WinExec 隐式启动
3 MATLAB计算 修改 matlabrc.m 实现后台执行
4 结果导出 MATLAB的 save 命令输出数据文件
5 Delphi读取结果 读取ASCII数据文件
6 环境还原 恢复原始 matlabrc.m 文件

该方案实现了Delphi与MATLAB之间的数据中转式通信,充分发挥了Delphi在界面开发和MATLAB在数值计算方面的各自优势。

    TAGS:
    发表评论