vectorisation of a loop

3 visualizzazioni (ultimi 30 giorni)
Zaid B
Zaid B il 30 Nov 2021
Modificato: Matt J il 6 Dic 2021
the matrix is "Sea" of m*n dimension .. this is the code i would like to vectorize :
=======================
S = size(Sea);
i = 1;
while i < S(1)
indices = find ( pdist2( Sea( i , : ),Sea( i+1:S(1) , :)) <0.05 );
Sea(indices , : ) = [];
S = size(Sea);
i = i+1;
end
===========
desc : i'm trying to calculate the distance between each row and all the other rows in the matrix and delete the ones that are closer than 0.05

Risposte (2)

Matt J
Matt J il 30 Nov 2021
Modificato: Matt J il 1 Dic 2021
[m,n]=size(Sea);
D=pdist2(Sea,Sea);
D(1:m+1:end)=inf;
indices=any(triu(D<0.05),1);
Sea(indices,:)=[];
  12 Commenti
Zaid B
Zaid B il 2 Dic 2021
Modificato: Zaid B il 2 Dic 2021
thank you for answering , but why ( i - 1 ) is added on that line?!
("Moreover, I don't think there is any more optimization that can be done" ... i thought so , but wanted to check if anyone has a better idea that would help)
Zaid B
Zaid B il 2 Dic 2021
Modificato: Zaid B il 2 Dic 2021
i got it why is nedded there but i think "i + find(...)" not "(i-1)+find(..)" because it should keep the current i , thank you that was a great help there ^^

Accedi per commentare.


Matt J
Matt J il 2 Dic 2021
Modificato: Matt J il 2 Dic 2021
I find this version to be about 30% faster:
S = size(Sea,1);
i = 1;
t=0.05^2;
while i < S
indices=true(1,S);
indices(i+1:end) = sum( abs( Sea( i , : )-Sea( i+1:S , :) ).^2,2) >= t ;
Sea=Sea(indices , : );
S = size(Sea,1);
i = i+1;
end
  13 Commenti
Matt J
Matt J il 6 Dic 2021
Modificato: Matt J il 6 Dic 2021
If you have the Parallel Computing Toolbox, then making Sea a gpuArray should add some speed.
Zaid B
Zaid B il 6 Dic 2021
yeah i do , i ll try it and post the results later

Accedi per commentare.

Categorie

Scopri di più su Programming in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by