如何在Matlab中从标准输入读取数据

4
我有一个用于数据处理的Matlab脚本需要长时间运行。我想通过标准输入向它发送一个标志,告诉它我有新数据需要处理。当处理完成后,我还想从标准输出中读取一个标志。
换句话说,我有一个Process A,大约每一分钟向Matlab发送一个标志。我希望Matlab等待接收到此标志。
在Matlab进程中写入到标准输出只需调用fprintf即可轻松完成。但是如何从标准输入读取呢?在fopen的文档中并没有提及输入管道,fread也不例外。那么如何让Matlab脚本从标准输入读取呢?

你想如何通知你的脚本?它应该定期轮询还是在输入单词时执行回调函数? - Daniel
脚本应该轮询stdin以查看是否有任何内容被写入,或在stdin上执行阻塞读取。两者都足够了。(尽管使用Matlab的input内置函数不起作用,因为我认为它直接从键盘读取,而不是从stdin读取。) - Jamie
2个回答

3
事实上,解决方法非常简单,就是使用input命令。将下面的代码写入到myscript.m文件中即可:
str = input('', 's'); 
fprintf(str); 
exit;

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

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

确实,我们看到“Hello world”被打印到控制台上,还有Matlab的启动文本。

因此,总结一下,input从stdin读取,fprintf写入stdout。


这种方式可以读取带有换行符的输入,而不必使用像循环直到EOF之类的设备吗?当遇到第一个换行符时,input命令停止读取。我正在尝试将制表数据管道传输到Matlab脚本,而不必写入临时文件或FIFO。谢谢。 - user001
如果您不想循环直到看到EOF这样的哨兵字符,那么我认为实现您想要做的最好方法是始终将数据文件中的行数作为第一行发送到stdin。然后,假设您有5行,您可以在for循环中再次调用input 5次。 - Jamie

1
一种方法是使用命名管道。在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指令的解决方案,请让我知道。 - Jamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接