Speeding up for loop with if statement

6 次查看(过去 30 天)
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 CenterFile Exchange 中查找有关 Mathematics 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by