vectorisation a for loop

1 回表示 (過去 30 日間)
Johnny
Johnny 2019 年 12 月 8 日
コメント済み: Stephen23 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 件のコメント
Stephen23
Stephen23 2019 年 12 月 8 日
Because you are not concatenating anything, square brackets are not needed here:
dist=log((10:-1:1)+retint);

サインインしてコメントする。

採用された回答

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);

その他の回答 (1 件)

Stephen23
Stephen23 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)

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by