Как исправить ошибку «Допустимые индексы для« переменной »ограничены в циклах PARFOR» в matlab - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь настроить вложенный цикл parfor в MatLab R2016a, как показано ниже.

N = size(A,1);
M = size(v,1);
in = zeros(N*M,1);
parfor i=1:N
   for j=1:M
      k = (i-1)*M+j;
      if sqrt(sum((A(i,:)-v(j,:)).^2))<=tol
        in(k) = i;          
      end
   end
end

Однако я получаю следующую ошибку Допустимые индексы для 'in' ограничены вПетли PARFOR .Можно ли как-то исправить это, потому что массивы A и v значительно большие, более 40000 строк для A и 8000 v?Переменная tol равна 0,0959.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Проблема в том, что MATLAB не распознает, что переменная k правильно разрезает матрицу in.Решение должно заключаться в индексировании in с использованием i и j отдельно:

N = size(A,1);
M = size(v,1);
in = zeros(M,N);
parfor i=1:N
   for j=1:M
      if sqrt(sum((A(i,:)-v(j,:)).^2))<=tol
        in(j,i) = i;          
      end
   end
end
in = in(:); % reshape to a column vector, as the output in the question's code

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

A = reshape(A,1,N,[]);
v = reshape(v,M,1,[]);
in = sum(bsxfun(@minus,A,v).^2,3) < tol*tol;
in = in(:);

(или что-то подобное, я не запускал этот код ... Пожалуйста, дайте мне знать или исправьте сообщение, если есть опечатка или другая ошибка.)

0 голосов
/ 11 июня 2018
N = size(A,1);
M = size(v,1);
in = cell(N,1);
parfor i=1:N
    s=v;
    p=zeros(1:M,1);
   for j=1:M
      k = (i-1)*M+j;
      if sqrt(sum((A(i,:)-s(j,:)).^2))<=tol
        p(k) = i;          
      end
   end
   in{i}=single(p);
end
in=cell2mat(in);
in=reshape(in,[N*M,1]);

иногда matlab не распознает переменную в цикле parfor как «переменную среза», переменная среза - это переменная, которая имеет ссылку вне цикла parfor, и каждый из ее элементов доступен только одному работнику (в параллель parforработники)
, чтобы вы могли использовать временную переменную и собирать результаты после цикла parfor,

ПРИМЕЧАНИЕ 1. Лучше векторизовать код в более старых версиях, поскольку циклы раньше не были так хороши, кактеперь они в R2017, ссылаясь на ( this ).

ПРИМЕЧАНИЕ 2: если большинство элементов «in» равны нулю, попробуйте использовать «разреженную матрицу», которая может сэкономить много памяти;

...