How can I vectorize these for loops?

2 vues (au cours des 30 derniers jours)
Budhvin Jayasinghe
Budhvin Jayasinghe le 28 Mai 2020
Newbie here. I was wondering if there was a way to vectorize these for loops, or simply to change it to make it faster? Any help would be appreciated. Thank you!
m = zeros(50);
d = zeros(50);
for i = 1:size(m,1)
for n = 1:size(m,2)
try d(i,n) = sum(m(i-1:i+1,n-1:2:n+1),'all') + sum(m(i-1:2:i+1,n),'all');
catch, continue
end
end
end
What it does is scan the matrix positions immediately surrounding each matrix position being looped through and sums the values. It doesn't work at the edges or the corners, which is what the try, catch statement is for. Thanks again.
  2 commentaires
Stephen23
Stephen23 le 28 Mai 2020
Use conv2:
x = [1,1,1;1,0,1;1,1,1];
d = conv2(m,x,'same');
Budhvin Jayasinghe
Budhvin Jayasinghe le 28 Mai 2020
Thank you.

Connectez-vous pour commenter.

Réponse acceptée

Mohammad Sami
Mohammad Sami le 28 Mai 2020
What you are trying to do is 2D convolution. There is a function conv2 that will allow you to do this.
m = ones(50);
filter = ones(3);
filter(2,2) = 0;
% 3x3 filter with excluding the center.
d = conv2(m,filter,'same');
  1 commentaire
Budhvin Jayasinghe
Budhvin Jayasinghe le 28 Mai 2020
Thanks! This seems to work perfectly.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by