Speeding up for loop with if statement

6 views (last 30 days)
Josh Parks
Josh Parks on 23 Mar 2020
Commented: Josh Parks on 23 Mar 2020
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 Comments
Walter Roberson
Walter Roberson on 23 Mar 2020
accumarray(). You could probably do all of numer calculations at the same time. denom = sum(gamma, 2) in vectorized form
Josh Parks
Josh Parks on 23 Mar 2020
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

Sign in to comment.

Answers (0)

Categories

Find more on Mathematics in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!