如何在MatlabM文件中使用Bash shell脚本中的变量

如何在MatlabM文件中使用Bash shell脚本中的变量,bash,matlab,loops,text,while-loop,Bash,Matlab,Loops,Text,While Loop,我继承了一个调用函数的m文件: function conditions(varargin) 这要求我在运行m文件时键入一系列名称。例如: conditions('c01','c02','c03') 我还有一个文本文件conditions.txt,其中包含所有条件名称,每行一个条件。e、 g.,: 'c01' 'c02' 'c03' etc... 是否有一种方法可以通过运行文本文件的每一行(一次一行)来自动化Bash shell中的conditions.m?至少在windows上,您可以像这

我继承了一个调用函数的m文件:

function conditions(varargin)
这要求我在运行m文件时键入一系列名称。例如:

conditions('c01','c02','c03')
我还有一个文本文件conditions.txt,其中包含所有条件名称,每行一个条件。e、 g.,:

'c01'
'c02'
'c03'
etc...

是否有一种方法可以通过运行文本文件的每一行(一次一行)来自动化Bash shell中的conditions.m?

至少在windows上,您可以像这样从批处理中调用matlab函数:matlab-wait-r'conditions%var%'

因此,您的bash循环应该可以通过如下截取的代码来解决:

while read p; do
 matlab -wait -r 'conditions($p)'
done <yourfile.txt
或您选择的任何其他循环样式:
既然您也乐于接受其他建议,我建议您通过一个简单的MATLAB脚本来实现这一点。MATLAB启动需要一段时间,因此针对每种情况重新启动MATLAB是非常低效的

我将假设您的文本文件示例是一个简化,可能每行有多个参数,并且需要将它们作为参数传递给conditions函数。例如,文件conditions.txt可能包含:

'c01',5,false
'c02',100,true,0,'foo'
...
你会想打电话

conditions('c01',5,false)
conditions('c02',100,true,0,'foo')
...
以下代码实现了这一点:

f = fopen('conditions.txt','rt');
while true
   data = fgetl(f);
   if isequal(data,-1), break, end
   eval('conditions(',data,')')
end
fclose(f);
exit
您可以将其保存为M文件脚本,例如runconditions.M,并从bash中执行它,如下所示:

matlab -nosplash -nodesktop -r runconditions

一般来说,eval是邪恶的,但在本例中,它与Bash脚本中的操作相同。这个答案唯一的区别是避免了重复启动MATLAB。

为什么要使用Bash?只需使用MATLAB阅读文件并调用条件,更简单,不是吗?我不想离开Bash。你能解释一下为什么不想离开Bash吗?您希望不必学习如何在MATLAB中实现这一点,还是有其他一些约束条件?在MATLAB中执行此操作将更容易,效率也更高。对于我来说,很难为我认为是错误的问题推荐解决方案……它是分析管道的一部分,主要通过Bash脚本实现自动化,我对Bash更为熟悉。我不想更改M文件。但是如果通过matlab做这件事容易得多,我很乐意接受所有的建议。这似乎不起作用。虽然输出指示它逐行在文本文件中运行,但它仅对第一个输入(即第1行)执行功能。因此,如果在While循环中添加echo$p,它将显示每一行?echo指示它仅使用列表的第一行:“c01”。MATLAB脚本的bashshell输出表明,对于文本文件的其余行,它只是将该行输入MATLAB。也就是说,ans=c02>>ans==c03,等等。你确定你没有关于多引号的问题吗?并不是说您在文件和matlab调用中使用了相同的类型。注意:因为Matlab 2017 asdasd是一个字符串,而“asdt”是一个字符数组。@CrisLuengo我只是假设,如果有人执行bash中的某些内容,他们也希望控制返回代码,因此使用explit exitrc调用。