繁体   English   中英

从命令行调用MATLAB并保持打开以进行下一步处理 - Linux

[英]Call MATLAB from command line and keep it open for next processing - Linux

我想从C开发的软件中调用MATLAB 。我知道如何通过使用标准语法的系统调用来调用MATLAB:

matlab -nojvm

我的问题是,每次我花费大量时间打开一个新的MATLAB会话(当请求的处理结束时, MATLAB关闭,所以当新数据准备好处理时我必须重新执行它)。

有没有办法让MATLAB会话始终打开(并将其用作“服务器”),以及如何“通知”它可以处理新数据? 这将避免每次新的MATLAB会话时执行的痛苦,这非常耗时。

MATLAB有一个监听stdininput函数。 请考虑以下脚本,该脚本等待您的上游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的stdinstdout ,可能最干净的方法是:

  1. 调用pipe (2)两次以创建一对读/写管道连接到Matlab的stdin和stdout。
  2. 调用fork (2)来创建一个新的子进程。
  3. 在子进程中,使用dup (2)来
    1. 将一个管道的读取结束复制到文件描述符0( stdin ),然后
    2. 将另一个管道的写入端复制到文件描述符1( stdout )上。
  4. 让孩子调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM