3

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

matlab -nojvm

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

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

4

2 回答 2

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. 在写入最后一个块后,它甚至可以通过说 . 来告诉 MATLAB 脚本终止quit。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

input我刚刚在 MATLAB R2013a (8.1.0.604) 上对此进行了测试,但如果已经听了stdin很长时间,并且如果它适用于 Linux 上几乎任何版本的 MATLAB ,我不会感到惊讶。

于 2013-10-28T02:09:13.897 回答
0

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

如果你真的想写到 Matlab 的stdinand stdout,可能最干净的方法是:

  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 的输出更容易。

于 2013-10-28T02:26:36.863 回答