MATLAB parfor index exceeds the number of array elements

29 ビュー (過去 30 日間)
Preetham Manjunatha
Preetham Manjunatha 2020 年 7 月 26 日
コメント済み: Jungmin kim 2021 年 6 月 20 日
Why MATLAB throws an error even if it shouldn't go to the first case of the switch statement? Below is the minimal example:
mycase = 2;
non_crack_bytes = num2cell(1:6000);
syn_crack_bytes = num2cell(1:10000);
imgCount = 10000;
parfor j = 1 : imgCount
switch mycase
case 1
if ~(non_crack_bytes{j} == 0)
% Do something
else
continue;
end
case 2
if ~(syn_crack_bytes{j} == 0)
% Do something
else
continue;
end
end
end
The error I am getting is:
Error using ScratchPaperFile>(parfor supply)
Index exceeds the number of array elements (6000).
Error in ScratchPaperFile (line 10)
parfor j = 1 : imgCount
  2 件のコメント
Image Analyst
Image Analyst 2020 年 7 月 26 日
Why are you using cell arrays? That's not efficient. Don't do that when you have no reason to.
For me your code just hangs. However if I use "for" instead of "parfor" it finished in a split second.
Preetham Manjunatha
Preetham Manjunatha 2020 年 7 月 26 日
Even with the a regular array, it throws the same error.

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

採用された回答

Edric Ellis
Edric Ellis 2020 年 7 月 27 日
To run a parfor loop, MATLAB analyses each variable used within the loop and classifies them. In the original code, non_crack_bytes is classified as a "sliced input" variable - in other words, MATLAB considers that each iteration of the loop needs a single value from non_crack_bytes corresponding to the loop index j. The error occurs long before the worker tries to read from non_crack_bytes - the error occurs on the client trying to send the elements of non_crack_bytes that it thinks the worker will need. (This is why the error mentions "parfor supply", a bit of internal jargon relating to sending sliced loop inputs).
To fix this, one way is to introduce an additional access of non_crack_bytes inside the loop which changes it from a "sliced input" variable to a "broadcast" variable. That means that the client sends the whole of non_crack_bytes to each worker. One way to achieve that is like this:
parfor j = 1:imgCount
size(non_crack_bytes); % access whole of non_crack_bytes
switch mycase
case 1
if non_crack_bytes(j) ~= 0
... % etc.
  1 件のコメント
Jungmin kim
Jungmin kim 2021 年 6 月 20 日
This answer saves my time...
Thanks for the kind explanation :)

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

製品


リリース

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by