我想独立地迭代所有元素(尽管所有元素的条件相同)。我想在值停止更改时停止迭代。我将发布我的代码部分。根据一些研究,我认为它也可以使用parfor循环完成,但我不知道如何实现它。有谁可以请更正我的代码?在此先感谢。
probability = (ones(1,2048) .* 1/2048);
Tij = sum(StateTransitionfwd); %gives us an array of 2048 elements.
probability = ((probability * StateTransitionbwd) - (Tij .* probability));
threshold = (ones(1,2048) .* 0.05);
old = zeros(1,2048);
new = zeros(1,2048);
while(1)
probability = ((probability * StateTransitionbwd) - (Tij .* probability));
new = probability;
if old-new <= threshold
break
end
old = probability;
end
所以基本上我想要稳态概率(它不再改变的地方)
答案 0 :(得分:0)
对于一个你不能平行循环。
要实现parfor
循环,请确保以下内容:
- 必须在parfor循环之前定义所有变量。因此在循环之前定义输出变量。
- 所有迭代必须完全相互独立。
在您的情况下,第二个条件未得到满足,因为您不断更新变量new
,使其不是独立的。
我甚至没有平行化这个代码,因为它的目的是在它通过所有元素之前分解,但为了论证我会试试这个:
parfor ii = 1:length(Tij)
probability{ii} = ((probability * StateTransitionbwd) - (Tij .* probability));
end
使用单元格或矩阵,无论哪种对您的工作更有用。
现在,您可以继续使用简单的if
来查找您的阈值:
for ii = 1:length(probability)-1
if probability(ii+1)-probability(ii)<threshold
break
end
end
关于你的while循环停止条件:让循环不受控制地运行到一些条件是危险的,正如你所做的那样。它很容易陷入无限循环中。使用附加条件MaxIt
表示在终止之前要进行的最大迭代次数,无论其他条件如何。
while probability<threshold && MaxIt<someNumber
your code
end
此外,您正在检查完整阵列的有效性。
A = logical([1;0]);
while A
B=1;
end
C = logical([1;1]);
while C
D=1;
end
第一个while循环不会运行,因为其中一个条目不为true;第二个循环现在是一个无限循环。如果要在条件满足后立即终止每一行,请将while循环放在每行的for循环中。如果将while循环放入函数中,可以将forloop并行化,请参阅parfor文档。