我有一个基本结构如下的代码。因为有很多for循环迭代,我想将for循环转换为parfor循环。不幸的是,我收到了一个错误:The repmorary variable 'DeclaredVar' uses a value set outside the PARFOR
。有没有技术可以克服这些问题?
t = ee; % save my data in t. t is a Nx1 vector
boolvar = 0;
parfor x=1:length(xs) % xs is a Mx1 vector (N>>M).
xx = xs(x);
t = t(t>=xx); %% the temporary variable 't' uses a value set outside the PARFOR loop
if boolvar==0 %% the temporary variable 'boolvar' uses a value set outside the PARFOR loop
try
% Part 1 code
catch
boolvar = 1;
end;
end;
if boolvar==1
% execute Part 2 code if boolvar is true
end;
M(x,:) = % save data. M is a length(xs) x 2 matrix
end
谢谢!
答案 0 :(得分:0)
我试图弄清楚你的代码是做什么的。如果我错了,请纠正我 -
所以你想要通过一个向量xs
。每次从xx
中选择值xs
时,您只需选择t
和更新 t来过滤数据t>xx
。然后,如果旗帜下降,做一些事情,并举起旗帜;如果标志已经启动,请执行其他操作。
你肯定有2个问题在这里被Matlab抱怨了。
t
在每个循环中更新,取决于自己的值。
如果你一步一步地做,这不会受到伤害。考虑一盒20个编号的球。您有一个数字列表randperm(20)
。
在每次迭代中,您查找列表中的数字,找到带有该数字的球,然后将其从框中删除,最后记录框中剩下的内容。这很容易。
但是现在认为你有3名工作人员会为你完成这项工作。他们彼此独立,在不同的地方工作,随机变化(例如取决于天气和他们的心情),速度。每当他们从列表中询问您的号码时,请按照上面的方框进行操作,然后告诉您内部的内容。重复同样的游戏3次。他们的结果不是相同的,因为工人自己 - 但不是你的数据 - 有不确定性。
boolvar
在每个循环中都会更新,仅在为false时才会更新。
再次,对工人来说,没什么奇怪的,他们只是按照你的指示。
但对你(和Matlab)来说,最终结果将取决于天气。至少这是Matlab的设计师所不允许的,他们必须不喜欢不确定性。
关键是你不能在并行过程中读取或写入相同的变量,因为你无法预测没有不确定性的结果。见getting started with parfor
。
parfor
中使用的变量应归类为"循环","切片","广播","缩减&# 34;和"临时"。有关详细信息,请参阅advanced topic。你得到的错误说Matlab将t
和boolvar
识别为临时变量,因为你在循环中为它赋值;但循环也依赖于parfor
循环之外的值。