индексирование внутри цикла parfor - matlab - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь запустить этот код в Matlab

a = ones(4,4);

b=[1,0,0,1;0,0,0,1;0,1,0,0;0,0,0,0];
b(:,:,2)=[0,1,1,0;1,1,1,0;1,0,1,1;1,1,1,1];

parfor i = 1:size(b,3)
    c = b(:,:,i)
    a(c) = i;

end

но получите ошибку:

Error: The variable a in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

1 Ответ

0 голосов
/ 15 сентября 2018

Существуют ограничения в том, как вы можете записывать в массивы внутри тела parfor loop.В общем случае вам нужно будет использовать нарезанные массивы .

Причина этой проблемы заключается в том, что Matlab должен предотвратить доступ разных рабочих к одним и тем же данным, что приведет к непредсказуемым результатам (поскольку своевременный порядок, в котором parfor циклически перебирает i, не определяется).

Итак, хотя в вашем примере рабочие не работают с одинаковыми записями a, из-за способа индексации a (с массивом логики) это в настоящее время невозможночтобы Matlab мог решить, так ли это (или, другими словами, Matlab не может классифицировать a).

Редактировать: Для полноты я добавляю некоторый код, эквивалентный вашему примеру, хотя я предполагаю, что ваша настоящая проблема связана с более сложной логической индексацией?

a = ones(4,4,4);

parfor i = 1:size(a,1)
    a(i, :, :) = zeros(4, 4) + i;  % this is sliced indexing
end

Редактировать: Поскольку пример OP был изменен, приведенный выше код больше не эквивалентен примеру.

...