For loop in parfor loop

8 ビュー (過去 30 日間)
Niels
Niels 2015 年 3 月 10 日
コメント済み: Niels 2015 年 3 月 10 日
Dear all, I am trying to run the following script
a = linspace(0,10);
parfor ii=1:2
for jj=1:length(a)
x(ii,jj) = rand;
end
end
which fails with an "Error: The variable x in a parfor cannot be classified." Is this a bug in Matlab? I would simply consider the vector "a" a broadcast variable, since "a" and "length(a)" are unmodified by the script.
How would you recommend to fix the script, taking into account that length(a) should be evaluated inside the parfor loop?
Thanks, Niels

採用された回答

Greig
Greig 2015 年 3 月 10 日
I don't know the details (perhaps another answer can get technical), but parfor loops don't like assigning values to things like x(ii, jj) directly, so you have to use temporary variables that are accessed only in the parfor loop. Try something like this....
a = linspace(0,10);
x=NaN(2,length(a)); % pre-allocated for speed
parfor ii=1:2
tmp_var=NaN(1,length(a)); % pre-allocate a temporary variable
for jj=1:length(a)
tmp_var(jj) = rand;
end
x(ii,:) = tmp_var; % assign it to x
end

その他の回答 (1 件)

Edric Ellis
Edric Ellis 2015 年 3 月 10 日
編集済み: Edric Ellis 2015 年 3 月 10 日
The limitation you're hitting here is that any for loop nested inside a parfor loop must have constant bounds to allow slicing. In your case, the bounds are constant, so you can simply write:
a = linspace(0,10);
n = length(a); % extract length outside PARFOR
parfor ii=1:2
for jj=1:n % constant bounds loop inside PARFOR
x(ii,jj) = rand;
end
end
This limitation is documented here.
In the case where your inner for loop has non-constant bounds, then @Greig's solution is the way to go.
  1 件のコメント
Niels
Niels 2015 年 3 月 10 日
Great, thank you both for your replies, I will follow your suggestions! :-) Best regards, Niels

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeParallel Computing についてさらに検索

タグ

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by