我想从C开发的软件中调用MATLAB
。我知道如何通过使用标准语法的系统调用来调用MATLAB:
matlab -nojvm
我的问题是,每次我花费大量时间打开MATLAB
的新会话时(当请求的处理结束时,MATLAB
关闭,所以我必须在新的时候重新执行它数据已准备好进行处理)。
有没有办法让MATLAB会话始终打开(并将其用作“服务器”),以及如何“通知”它可以处理新数据?这将避免每次新的MATLAB会话时执行的痛苦,这非常耗时。
答案 0 :(得分:0)
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
。在写完最后一个块之后,它甚至可以通过说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。
答案 1 :(得分:0)
Mathworks提供了一些文档和示例代码,介绍如何在Documentation Center中从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的输出更容易。