我在以下网站的帮助下设法在后台运行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
答案 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)
效果很好!