вложенный цикл Matlab или цикл parfor

У меня есть вложенный цикл for, но он немного замедляет обработку, как сделать вложенные циклы эффективными. Мне нужно, чтобы для каждого значения внешнего цикла внутренний цикл продолжал все свои итерации. Однако я не думаю, что это влияет на вычисления так сильно, как на два вложенных цикла. Мой второй вопрос, parfor петля может влиять на скорость или может поддерживать мои явления?

Мой код:

n=2;
for i=1:500
for jj=1:n
    A{1}=['Obj' num2str(1)];
    A{2}=['Obj' num2str(2)];
end  
end

person Community    schedule 24.04.2014    source источник
comment
возможный дубликат Как вложить несколько циклов parfor   -  person Daniel    schedule 25.04.2014


Ответы (1)


Ваши вложенные циклы, как они есть, не зависят от параметров цикла, поэтому вы можете переформатировать код выше. Но в целом, пока ваши итерации не зависят друг от друга и количество итераций достаточно велико, чтобы поддерживать задержку при инициализации параллельной обработки, цикл parfor разрешен и работает лучше (соответственно). Если вы работаете с какой-либо ячейкой или матрицей, и ваши вложенные циклы покрывают ее связанную часть, вы всегда можете использовать подход с линейным индексом. Например

n=100;
s=0;
a=randi([1 n],n);
for i=1:n
   for j=1:n
       s=s+a(i,j);
   end
end

можно переписать как

n=100;
s=0;
a=randi([1 n],n);
for i=1:n^2
    s=s+a(i);
end

Но опять же, если ваш массив большой и ваши итерации не зависят друг от друга, обычно лучше воспользоваться конструкцией parfor.

person oligilo    schedule 24.04.2014
comment
мой внутренний цикл зависит от внешнего цикла, так как для каждой итерации внешнего цикла внутренний цикл должен полностью завершать свои итерации. Также я реализовал массив ячеек, поэтому цикл parfor не допускал массивов ячеек. - person ; 25.04.2014
comment
под зависимостью одной итерации от другой я подразумеваю нечто вроде a(i,j)=a(j,i), а не s=s+a(i,j); что-то, что изменяет массив, на который вы ссылаетесь, от одной итерации к другой. Если это так, то да, парфор вам не подойдет. Я бы посоветовал вам взглянуть на документацию Matlab по «parfor» для лучшего объяснения, чем то, что я пытаюсь передать. - person oligilo; 25.04.2014
comment
да, я понимаю это, но проблема в том, что является основной проблемой. Я использую массивы ячеек, но как я могу использовать parfor в этом случае? - person ; 25.04.2014
comment
Вы не можете использовать parfor, но вы все равно можете использовать линейный индекс. Кроме того, если ваш массив ячеек является числовым (или если вы можете сделать его числовым, а затем преобразовать обратно), вы можете использовать cell2mat вместе с parfor. - person oligilo; 25.04.2014
comment
Хорошо, parfor можно использовать с матрицами. Пожалуйста, скажите мне M = ['Obj' num2str(i:1:n)];, как это может повториться с 1 по n - person ; 25.04.2014
comment
Требуется небольшая подготовка, чтобы превратить ячейку строк в матрицу (если это возможно), и это того стоит, только если размер вашей ячейки достаточно велик, а операция после for или parfor является обратимой. Учитывая, что вы имеете в виду ячейку M={'Obj' num2str(1:n)}, вы можете представить ее как матрицу [0 1:n] (ноль для 'Obj'), прочитать что-нибудь из этой матрицы в parfor, а затем преобразовать результат вашего цикла обратно в строки, заменив ноль на «Obj» и т. д. - person oligilo; 25.04.2014
comment
И снова ваш (вложенный) цикл ничего не делает с переменной A после первой итерации; «Возможно, вы захотите пересмотреть свой код выше». - person oligilo; 25.04.2014
comment
на самом деле у него есть массив, который меняется, все, что я хочу, это эффективное управление вложенными циклами, так как внешний цикл может длиться бесконечное время, но внутренний цикл зависит от этого. Я сделал это, работает нормально, но замедляет скорость. - person ; 25.04.2014
comment
Думаю, у меня закончились идеи/догадки :-) - person oligilo; 25.04.2014