数组

时间:2015-08-17 07:41:42

标签: matlab parallel-processing iteration parfor

我想独立地迭代所有元素(尽管所有元素的条件相同)。我想在值停止更改时停止迭代。我将发布我的代码部分。根据一些研究,我认为它也可以使用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

所以基本上我想要稳态概率(它不再改变的地方)

1 个答案:

答案 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文档。