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

时间:2013-10-27 18:23:10

标签: c linux matlab command-line

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

matlab -nojvm

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

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

2 个答案:

答案 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的stdinstdout,可能最简洁的方法是:

  1. 调用pipe(2)两次以创建一对读/写管道连接到Matlab的stdin和stdout。
  2. 致电fork(2)以创建新的子流程。
  3. 在子进程中,使用dup(2)
    1. 将一个管道的读取结束复制到文件描述符0(stdin)和
    2. 将另一个管道的写入端复制到文件描述符1(stdout)。
  4. 让孩子打电话execve(2)来调用Matlab
  5. 父级,现在可以将命令写入第一个管道,它们将被发送到Matlab。您可能必须在每个命令后调用flush,具体取决于您打开和写入管道的方式。第二个管道连接到Matlab的stdout,将捕获Matlab的文本输出。

    我不确定Matlab是否向stderr发送任何内容。如果是,并且您想要捕获它,请创建一个绑定到stderr的第三个管道(文件描述符2)。否则,它将转到原始程序的stderr,这可能是您想要的,也可能不是。

    我没有使用过Matlab的C / C ++接口,但我猜想使用它可能比尝试解析Matlab的输出更容易。