Как векторизовать двойной цикл for в MATLAB? - PullRequest
1 голос
/ 13 октября 2019

У меня есть код, который усредняет 4 смежных значения в элементах с двойным циклом, я хочу векторизовать его, как я могу добиться этого?

  for i=2:99
        for j=2:99
        T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4;   %adjacent units avarage
        end
  end

1 Ответ

1 голос
/ 14 октября 2019

Вот векторизованная версия вашего кода:

T1(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;

Следующий пример кода подтверждает, что векторизованный код дает тот же результат, что и циклы:

T0 = imresize(im2double(imread('cameraman.tif')), [100, 100]); %Read image - used as input for the test.

T1 = T0;
for i=2:99
    for j=2:99
        T1(i,j)= (T0(i+1,j) + T0(i-1,j) + T0(i,j+1) + T0(i,j-1))/4;   %adjacent units avarage
    end
end

T2 = T0;
T2(2:end-1, 2:end-1) = (T0(3:end, 2:end-1) + T0(1:end-2, 2:end-1) + T0(2:end-1, 3:end) + T0(2:end-1, 1:end-2))/4;

disp(['Maximum difference = ', num2str(max(abs(T1(:) - T2(:))))]);

Использование imfilter (или conv2 ):
Ваш код эквивалентен свертке T0 и [0,1,0;1,0,1;0,1,0]./4, как упомянуто Даниилом.
Результат на полях различен- Я заменил поля на поля T0.

%Filter kernel:
h = [0 1 0
     1 0 1
     0 1 0]/4;

T3 = imfilter(T0, h);

T4 = T0;
T4(2:end-1, 2:end-1) = T3(2:end-1, 2:end-1); %Fix the margins.

disp(['Maximum T4 difference = ', num2str(max(abs(T1(:) - T4(:))))]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...