vectorisation a for loop

3 vues (au cours des 30 derniers jours)
Johnny
Johnny le 8 Déc 2019
Commenté : Stephen23 le 8 Déc 2019
c=5;
retint=0;
dist=log([10:-1:1]+retint);
for i=1:length(dist)
eta=exp(-c*abs(dist(i)-dist));
discrim(i)=1/sum(eta);
end
Does anyone know how to vectorise this for loop to make it more efficient?
  1 commentaire
Stephen23
Stephen23 le 8 Déc 2019
Because you are not concatenating anything, square brackets are not needed here:
dist=log((10:-1:1)+retint);

Connectez-vous pour commenter.

Réponse acceptée

David Hill
David Hill le 8 Déc 2019
Although arrayfun is really a loop,
c=5;
retint=0;
dist=log([10:-1:1]+retint);
discrim=arrayfun(@(x)1/sum(exp(-c*abs(dist-x))),dist);

Plus de réponses (1)

Stephen23
Stephen23 le 8 Déc 2019
Real vectorized code (no loop or arrayfun):
eta = exp(-c*abs(bsxfun(@minus,dist,dist(:))));
discrim = 1./sum(eta,1)
Or for MATLAB versions >=R2016b:
eta = exp(-c*abs(dist-dist(:)));
discrim2 = 1./sum(eta,1)

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by