【问题标题】:How to read from stdin in Matlab如何在 Matlab 中读取标准输入
【发布时间】:2014-05-26 18:16:05
【问题描述】:

我有一个用于数据处理的长时间运行的 Matlab 脚本。我想通过标准输入向它发送一个标志,告诉它我有新数据要处理。我还想在处理完成后从 stdout 读取一个标志。

换句话说,我有一个进程 A,它大约每分钟向 Matlab 发送一个标志。我希望 Matlab 等到它收到这个标志。

在 matlab 进程中写入标准输出就像调用 fprintf 一样简单。但是我怎样才能从标准输入中读取呢? fopen 上的文档没有提到输入管道,fread 也没有。如何让 Matlab 脚本从标准输入读取?

【问题讨论】:

  • 你想如何通知你的脚本?它应该定期轮询还是应该在输入单词时执行回调函数?
  • 脚本应该轮询 stdin 以查看是否已写入任何内容或在 stdin 上执行阻塞读取。要么就足够了。 (虽然使用 Matlab 的 input 内置函数不起作用,因为我认为它直接从键盘读取,而不是标准输入。)

标签: matlab ipc matlab-deployment


【解决方案1】:

事实证明,解决方案就像input 一样简单。将以下内容写入 myscript.m:

str = input('', 's'); 
fprintf(str); 
exit;

然后,在 shell 中运行以下命令:

echo Hello world | matlab -nosplash -nodisplay -nodesktop -r "myscript"

确实,我们看到控制台打印出了“Hello world”,以及 Matlab 的启动文本。

因此,总而言之,input 从标准输入读取,fprintf 写入标准输出。

【讨论】:

  • 能否以这种方式读取带有换行符的输入,而无需使用诸如循环直到 EOF 之类的设备? input 命令在遇到第一个换行符时停止读取。我正在尝试将表格数据通过管道传输到 matlab 脚本而不写入临时文件或 fifo。谢谢。
  • 如果您不想循环直到看到像 EOF 这样的哨兵字符,那么我认为完成您的意思的最佳方法是始终发送数据中的行数文件作为标准输入的第一行。然后,假设您有 5 行,您可以在 for 循环中再次调用 input 5 次。
【解决方案2】:

一种方法是使用named pipe。在 shell 中,运行 mkfifo MY_PIPE 以创建命名管道。这将创建一个名为 MY_PIPE 的类似文件的对象,您可以对其进行读写。然后,将发送数据的程序的输出重定向到 MY_PIPE,例如./program.sh > MY_PIPE。最后,要在 Matlab 中读取管道,可以使用fopen('MY_PIPE', 'r')

请注意,答案在以下几个方面受到限制:

  1. 它只能在 Linux 环境中运行并且可以访问 shell。

  2. 它不使用 Matlab 内置插件,有点 hackish。

【讨论】:

  • 如果有人有使用 Matlab 内置函数而不是 shell 指令的解决方案,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2018-03-22
  • 1970-01-01
  • 2011-06-02
  • 2010-11-29
相关资源
最近更新 更多