MATLAB - MATLAB 32bit 和 64bit 之间的交互

Posted

技术标签:

【中文标题】MATLAB - MATLAB 32bit 和 64bit 之间的交互【英文标题】:MATLAB - interaction between MATLAB 32bit and 64bit 【发布时间】:2019-11-21 09:51:51 【问题描述】:

问题

我有两个工具用 MATLAB 编写(我不是作者):

    第一个允许我从 SQL 数据库中检索一些数据,但它仅适用于 MATLAB 64 位(我有 MATLAB 2016b 64 位)。 第二个使用从第一个工具检索到的数据,并通过 在 32 位系统上编译的 DLL,它会得到一些输出。如前所述, 此工具仅适用于 MATLAB 32 位(我有 MATLAB 2013a 32 位)。

我想做的是:

    在 MATLAB 64 位中从 SQL 获取数据 以某种方式将它们“发送”到 MATLAB 32 位 在 MATLAB 32 位上运行该工具 将 MATLAB 32 位的输出“返回”到 MATLAB 64 位

我知道可以使用 IPC 机制找到解决方案,但我不确定如何找到它们或如何在 MATLAB 中使用它们。有人用过这种东西吗?

查看 MATLAB 文档,我看到可以创建 COM 对象,但我不确定如何使用它在 MATLAB 32 位中运行一些函数。

解决方案

正如下面@nekomatic 所建议的,如果我按照建议的方式运行代码,一切都对我有用,但不包括下面系统命令中的-automatic。 最终的系统命令格式为

system('"C:\path\to\R2013a\matlab.exe" -wait -r "mycommand; exit"')

mycommand 是一个 MATLAB 脚本,它加载输入文件,执行一些操作,然后保存输出文件。

【问题讨论】:

这里是速度问题吗?例如,您是否可以在每次需要运行第二个工具时等待 MATLAB R2013a 启动,或者您是否需要在几秒钟或更短的时间内完成该过程? 速度没问题。我只想主要使用 MATLAB 64bit 来处理数据。所以,我需要从 MATLAB 64bit 启动一个 MATLAB 32bit 会话,在 MATLAB 32bit 中执行一个函数,将输出返回到 MATLAB 64bit。 【参考方案1】:

如果你不需要这个操作很快,最简单的方法可能是:

将 64 位 MATLAB 中的数据另存为 .mat 文件 使用system 命令启动 32 位 MATLAB 实例 在 32 位 MATLAB 中运行脚本,从文件中读取数据、处理并保存数据 将结果读回您的 64 位程序。

例如,64 位代码(不包括错误处理、当前文件夹设置等)可能如下所示:

delete result.mat % Delete any result from the previous run
save(data.mat, '-v7.3') % usually best to specify the .mat format to use
system('"C:\path\to\R2013a\matlab.exe" -automation -wait -r "mycommand; exit"')
processedData = load('result.mat')

其中mycommand 是您的 MATLAB R2013a 脚本,它从data.mat 读取数据,对其进行处理,并将结果保存在result.mat 中。

有关 R2013a here(假设 Windows)的启动选项和 R2016b here 的 system 命令的更多数据。您可能需要使用 Mathworks 帐户登录才能查看旧版本的文档,但如果这是一个问题,请查看您各自 MATLAB 安装中的帮助。

【讨论】:

如果我有一个函数我想在脚本 testRunScript 中运行并且函数的形式是 function output = runScript(input) ... output = function2 (输入)结束,我如何在你上面写的代码中实现它?谢谢 对不起,我不太明白这个问题。在我的示例中,您需要编写一个脚本并将其保存为 MATLAB R2013a 路径上的某个位置的 mycommand.m,以便您只需在 R2013a 命令窗口中键入 mycommand 即可运行它。该脚本必须从您选择保存它的任何位置加载data.mat,使用您的DLL对其进行处理,并将结果保存为result.mat,以便R2016b代码可以再次读取它。我假设您了解 MATLAB 中的脚本和函数的基础知识。 完美。抱歉,我只错过了您对“命令”的含义以及它应该具有“命令文件”的结构。我写了一个简单的脚本来加载 mat 文件,它会做一些其他的事情,然后将结果保存在另一个 mat 文件中。 MATLAB 64bit 中的系统命令是system('"C:\Program Files (x86)\MATLAB\R2013a\bin\matlab.exe" -automation -wait -r "testRunModel; exit"'),但它似乎不起作用。我看到光标加载,命令窗口中没有任何反应(我要求显示一些文本)。 testRunModel 是简单的 .m 脚本。 从命令提示符发出此命令是否有效?对于调试,您可以尝试从-r 之后的字符串中删除-automation 选项和; exit,您可以尝试使用-logfile filename 选项来捕获任何输出。我没有 R2013a,因此无法在该特定版本上进行测试,但根据文档,它应该是这样工作的。 太棒了@nekomatic!删除 -automatic 一切正常。

以上是关于MATLAB - MATLAB 32bit 和 64bit 之间的交互的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 编译器链接错误(64 位与 32 位)

matlab读12bit数据

MATLAB连接MySQL数据库

我的windows7旗舰版32位,安上matlab7.1后,其他应用可以,但是simulink是灰色,不可用,怎么回事呢?

DSP视频教程第6期:Matlab和VSCode联调,使用贼舒服,方便测试验证,全程无需打开Matlab(2022-04-09)

Matlab位运算笔记