我想MATLAB
从用 C 开发的软件调用。我知道如何调用 MATLAB,通过使用标准语法的系统调用:
matlab -nojvm
我的问题是每次我花很多时间打开一个新会话MATLAB
(当请求的处理结束时,MATLAB
关闭,所以当新数据准备好处理时我必须重新执行它)。
有没有办法让 MATLAB 会话始终打开(并将其用作“服务器”),以及如何“通知”它有新数据可供处理?这将避免每次执行一个新的 MATLAB 会话时的痛苦,这真的很耗时。
我想MATLAB
从用 C 开发的软件调用。我知道如何调用 MATLAB,通过使用标准语法的系统调用:
matlab -nojvm
我的问题是每次我花很多时间打开一个新会话MATLAB
(当请求的处理结束时,MATLAB
关闭,所以当新数据准备好处理时我必须重新执行它)。
有没有办法让 MATLAB 会话始终打开(并将其用作“服务器”),以及如何“通知”它有新数据可供处理?这将避免每次执行一个新的 MATLAB 会话时的痛苦,这真的很耗时。
MATLAB 有一个input
函数可以监听stdin
. 考虑以下脚本,它等待上游 C 程序输入它已写入并刷新到磁盘的数据块的文件名:
while true()
% wait for upstream process to enter filename
filename = input('', 's');
% quit means we're done
if strcmp(filename, 'quit')
quit()
end
% run secondary processing as instructed
process_chunk(filename);
end
C 程序可以简单地将数据文件的名称写入stdout
. 在写入最后一个块后,它甚至可以通过说 . 来告诉 MATLAB 脚本终止quit
。C 程序本质上可能如下所示:
for (int n = 0; n < N_CHUNK; n ++)
{
// generate a filename for this chunk
char filename[32];
sprintf(filename, "chunk%d.txt", n);
// do the actual work, generating a data file
write_chunk(n, filename);
// tell MATLAB to process that file
printf("%s\n", filename);
}
// tell MATLAB we're done
printf("quit\n");
为了使两者协同工作,C 程序必须“键入”到 MATLAB 进程中。如果 C 程序已命名foo
且脚本位于 中bar.m
,则将它们链接在一起,如下所示:
$ foo | matlab -nojvm -nodisplay -r bar
input
我刚刚在 MATLAB R2013a (8.1.0.604) 上对此进行了测试,但如果已经听了stdin
很长时间,并且如果它适用于 Linux 上几乎任何版本的 MATLAB ,我不会感到惊讶。
Mathworks 在其文档中心提供了一些关于如何从 C、C++ 和 Fortran 调用 Matlab 的文档和示例代码。看起来您可以设置 Matlab 变量并传入任意字符串,然后从其他变量中读取结果。
如果你真的想写到 Matlab 的stdin
and stdout
,可能最干净的方法是:
pipe
(2) 两次以创建一对读/写管道以连接到 Matlab 的标准输入和标准输出。fork
(2) 创建一个新的子进程。dup
(2) 来
stdin
) 上,然后stdout
) 上。execve
(2) 调用 Matlab父级现在可以将命令写入第一个管道,它们将被发送到 Matlab。flush
根据您打开和写入管道的方式,您可能必须在每个命令之后调用。连接到 Matlab 的第二个管道stdout
将捕获从 Matlab 输出的文本。
我不确定 Matlab 是否向stderr
. 如果是这样并且您想捕获它,请创建绑定到stderr
(文件描述符 2)的第三个管道。否则,它将转到您的原始程序stderr
,这可能是也可能不是您想要的。
我没有使用过 Matlab 的 C/C++ 接口,但我猜想使用它可能比尝试解析 Matlab 的输出更容易。