#matlab #for-loop
#matlab #for-цикл
Вопрос:
В настоящее время я пишу код, который включает этот for
цикл
for i = 1:17
for j = 1:17
if M(i,j,1) < d/2 amp;amp; M(i,j,2) < d/2 amp;amp; M(i,j,1) > -d/2 amp;amp; M(i,j,2) > -d/2
I = I0*(w0/w)^2*exp(-2*(M(i,j,1).^2 M(i,j,2).^2)/w^2);
else
I = 0;
end
end
end
где M
матрица содержит (x,y)
координаты для каждой позиции (i,j)
Пример:
(x1,y1) (x2,y1) (x3,y1)
(x1,y2) (x2,y2) (x3,y2)
(x1,y3) (x2,y3) (x3,y3)
Когда я выполняю этот код, я получаю значение для I
для каждой комбинации i
и j
, но я хотел бы поместить эти результаты в матрицу.
Как бы вы это сделали?
Комментарии:
1. По этой ссылке найдите индексирующие матрицы с двумя индексами .
2.
I(i,j) = ....
но также посмотрите на предварительное выделение памяти в matlab. (в принципе, вы должны перейтиI = zeros(17,17)
к своим циклам, но предварительное распределение Google в Matlab, чтобы понять, почему, это довольно важная концепция для пользователей Matlab
Ответ №1:
Легко, не используйте циклы for:
I = I0*(w0/w)^2*exp(-2*(M(:,:,1).^2 M(:,:,2).^2)/w^2);
mask = abs(M(:,:,1)) < d/2 amp; abs(M(:,:,2)) < d/2;
I(~mask) = 0;
Готово!
В противном случае I(i,j)
позволит хранить элементы в матрице. Тем не менее, вышеупомянутое решение рекомендуется с точки зрения скорости и ясности.
Комментарии:
1. Я искал способ отказаться от моего цикла for, зная, что это действительно не самый быстрый из возможных способов. И ваш метод работает абсолютно нормально, большое вам спасибо!!!