【问题标题】:Call MATLAB from command line and keep it open for next processing - Linux从命令行调用 MATLAB 并保持打开状态以进行下一次处理 - Linux
【发布时间】:2013-11-06 10:50:22
【问题描述】:

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

matlab -nojvm

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

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

【问题讨论】:

  • 这被称为 deaemonizing,可以按照here 的描述来完成。
  • 如果 Matlab 会话/服务器的生命周期与父进程不同,您只需要完全守护它(将其从 shell 中分离)。从原始描述中不清楚是否需要。
  • 你也可以看看this answer或者甚至this one

标签: c linux matlab command-line


【解决方案1】:

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,我不会感到惊讶.

【讨论】:

    【解决方案2】:

    Mathworks 在其Documentation Center 中提供了一些关于如何从 C、C++ 和 Fortran 调用 Matlab 的文档和示例代码。看起来您可以设置 Matlab 变量并传入任意字符串,然后从其他变量中读取结果。

    如果你真的想写信给 Matlab 的 stdinstdout,可能最干净的方法是:

    1. 调用pipe(2) 两次以创建一对读/写管道来连接到Matlab 的标准输入和标准输出。
    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 的输出更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2019-01-15
      • 2017-11-03
      • 2018-08-20
      相关资源
      最近更新 更多