Speeding up for loop with if statement

2 ビュー (過去 30 日間)
Josh Parks
Josh Parks 2020 年 3 月 23 日
コメント済み: Josh Parks 2020 年 3 月 23 日
Hi all,
Got what I believe is a noob question here: I have a function and it seems that 90% of my runtime is taken up by one loop. I'm wonderin if you guys can help me bring that down/out
The code is as follows (I've replaced the actually O and gamma variables with rands)
Note I originally wrote this with a lot of for loops as I was going to translate it to C and wanted the proting to be straight forward, but now I have this huge bottlneck (I would still prefer to solve it in a way that translates easily to C --- when I get time to port the project :P).
N = 4;
T = 3000000;
M = 170;
O = randi(M,1,T);
gamma = rand(N,T);
B = zeros(N,M);
for j = 1:N
denom = 0;
for t = 1:T
denom = denom + gamma(j,t);
end %t
for k = 1:M
numer = 0;
for t = 1:T
if(O(t) == k)
numer = numer + gamma(j,t);
end
end %t
B(j,k) = numer/denom;
end %k
end %i
  2 件のコメント
Walter Roberson
Walter Roberson 2020 年 3 月 23 日
accumarray(). You could probably do all of numer calculations at the same time. denom = sum(gamma, 2) in vectorized form
Josh Parks
Josh Parks 2020 年 3 月 23 日
Thanks, in case anyone was wondering about the solution:
denom = sum(gamma,2);
for j = 1:N
numerB = accumarray(O',gamma(j,:)',[M 1],@sum)';
B(j,:) = numerB./denom(j);
end %i

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

回答 (0 件)

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by