在背景BASH#3上使用Matlab命令运行循环

时间:2012-05-30 09:41:55

标签: bash matlab background

我在以下网站的帮助下设法在后台运行Matlab:

http://www.stat.osu.edu/computer-support/programming/background-jobs

我正在执行循环:

for ((i = 1; i <= 5; i++)); do
    echo $i>i.txt;
    matlab -nodesktop -nodisplay <script.m &> dummy.out &
done

在脚本中有一部分:

fid=fopen( 'a:\folder\i.txt');'];
iter=str2double(fgets(fid))
myfunction(iter,a,b,c)

myfunction.m的功能行是

myfunction(num,a,b,c)

此函数会保存一个名称也会根据'num'

的值更改的文件

意思是,输出将是:第一个命令的myfile1.mat,第二个命令的myfile2等。

当我在没有循环的情况下运行命令时

echo 1>i.txt;
matlab -nodesktop -nodisplay <script.m &> dummy.out &
echo 2>i.txt;
matlab -nodesktop -nodisplay <script.m &> dummy.out &

etc...

没有问题,输出很好

当我运行循环时,我得到的唯一文件是myfile5.mat

我已经更改了代码,输入将是myfunction(i1,a,b,c),myfunction(i2,a,b,c)......但结果保持不变。

我认为,由于保存部分位于函数的末尾(运行很长一段时间),所有函数'num'都是5(循环完成得比计算快得多)。

任何想法? TNX

3 个答案:

答案 0 :(得分:2)

问题是您使用相同的文件运行作业,因为它在后台模式下运行,首先文件包含“1”,之后是“2”,“3”,“4”,“5”,并且仅之后,第一个脚本开始评估(并且在文件中已经看到“5”,而不是“1”)。

您现在正尝试通过文件将参数传递给函数,对吧?我只是想知道,为什么不将参数传递给函数本身?在Matlab中并行运行许多函数(在后台模式下),例如:http://www.mathworks.ch/matlabcentral/newsreader/view_thread/166876

答案 1 :(得分:2)

问题是MATLAB调用后的符号(&)符号 - 发生的是循环开始运行,将值1置于i.txt,然后分叉一个MATLAB过程,然后循环再次运行,将值2放入i.txt,然后分离另一个 MATLAB过程,依此类推。现在MATLAB需要一段时间才能启动,这个循环非常快,因为它没有等待MATLAB调用完成,所以当第一个MATLAB实例最终完成时,循环很长时间,i.txt中的值是5为所有电话。

简短版:删除&标志:)

这将使MATLAB在继续循环之前运行并完成。

答案 2 :(得分:0)

我找到了解决问题的方法,

这很简单,我所要做的就是将变量导出到环境中,然后在MATLAB脚本中读取它们

for ((i = 1; i <= 5; i++)); do
     export i
     matlab -nodesktop -nodisplay <script.m &> dummy.out &
done

并在script.m

iter=str2double(getenv('i'))
myfunction(iter,a,b,c)

效果很好!