MATLAB Answers

vectorisation a for loop

2 ビュー (過去 30 日間)
Johnny
Johnny 2019 年 12 月 8 日
Commented: Stephen Cobeldick 2019 年 12 月 8 日
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 件のコメント

Stephen Cobeldick
Stephen Cobeldick 2019 年 12 月 8 日
Because you are not concatenating anything, square brackets are not needed here:
dist=log((10:-1:1)+retint);

サインイン to comment.

採用された回答

David Hill
David Hill 2019 年 12 月 8 日
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);

  0 件のコメント

サインイン to comment.

More Answers (1)

Stephen Cobeldick
Stephen Cobeldick 2019 年 12 月 8 日
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)

  0 件のコメント

サインイン to comment.

サインイン してこの質問に回答します。


Translated by