Как заполнить матрицу результатами цикла for

#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, зная, что это действительно не самый быстрый из возможных способов. И ваш метод работает абсолютно нормально, большое вам спасибо!!!