Matlab, если условие без цикла - PullRequest
2 голосов
/ 26 февраля 2012

В цикле есть маты A (n, 1), B (n, 1) и следующее условие

for i=1:m
   if ( A(i, 1) > error )
      B(i,1) = 0;
   else
      B(i,1) = exp (-A(i,1) / 100)
   end
end

Как переписать это условие без использования цикла?Возможно ли что-то подобное

 if ( A(:, 1) > error )
      B(:,1) = 0;
   else
      B(:,1) = exp (-A(:,1) / 100)
 end

Ответы [ 2 ]

7 голосов
/ 26 февраля 2012

Использование логическое индексирование :

idxs = (A > error);
B( idxs) = 0;
B(~idxs) = exp(-A(~idxs) / 100);
2 голосов
/ 26 февраля 2012

Вы были близки с вашим предложением. Ключ должен сформировать «логический индекс».

i = A(:,1) > error;

B(i,:) = 0;
B(~i,:) = exp (-A(:,1) / 100);

Поскольку ваши матрицы A и B являются векторами (одномерными матрицами), (:,1) и (i,:) в этом случае не нужны, но, поскольку они были в вашей первоначальной формулировке, я оставил их. Если вы были используя вместо этого многомерные матрицы (m * n), вы можете сформировать (m * n) логический индекс, а не (m * 1), выполнив i = A > error; вместо i = A(:,1) > error;

...