0

在以下网站的帮助下,我设法在后台运行了 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

4

3 回答 3

2

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

简短版:删除&标志:)

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

于 2012-05-30T16:52:15.417 回答
2

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

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

于 2012-05-30T10:41:24.343 回答
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)

效果很好!

于 2012-06-01T02:42:25.607 回答