[英]Call MATLAB from command line and keep it open for next processing - Linux
我想从C开发的软件中调用MATLAB
。我知道如何通过使用标准语法的系统调用来调用MATLAB:
matlab -nojvm
我的问题是,每次我花费大量时间打开一个新的MATLAB
会话(当请求的处理结束时, MATLAB
关闭,所以当新数据准备好处理时我必须重新执行它)。
有没有办法让MATLAB会话始终打开(并将其用作“服务器”),以及如何“通知”它可以处理新数据? 这将避免每次新的MATLAB会话时执行的痛苦,这非常耗时。
MATLAB有一个监听stdin
的input
函数。 请考虑以下脚本,该脚本等待您的上游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
。 在写完最后一个块之后,它甚至可以通过说quit
来告诉MATLAB脚本终止。 从本质上讲,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
我刚刚在MATLAB R2013a(8.1.0.604)上对此进行了测试,但如果input
已经长时间监听stdin
,并且如果这适用于Linux上几乎任何版本的MATLAB,我都不会感到惊讶。
Mathworks提供了一些文档和示例代码,介绍如何在文档中心从C,C ++和Fortran调用Matlab。 看起来您可以设置Matlab变量并传入任意字符串,然后从其他变量中读取结果。
如果你真的想写Matlab的stdin
和stdout
,可能最干净的方法是:
pipe
(2)两次以创建一对读/写管道连接到Matlab的stdin和stdout。 fork
(2)来创建一个新的子进程。 dup
(2)来
stdin
),然后 stdout
)上。 execve
(2)来调用Matlab 父,现在可以将命令写入第一个管道,它们将被发送到Matlab。 您可能必须在每个命令后调用flush
,具体取决于您打开和写入管道的方式。 连接到Matlab的stdout
的第二个管道将捕获Matlab的文本输出。
我不确定Matlab是否向stderr
发送任何内容。 如果是,并且您想要捕获它,请创建绑定到stderr
的第三个管道(文件描述符2)。 否则,它将转到您原始程序的stderr
,这可能是您想要的,也可能不是。
我没有使用Matlab的C / C ++接口,但我猜想使用它可能比尝试解析Matlab的输出更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.