Vectorization question (trying to avoid for loops)
이전 댓글 표시
Dear all, I know that this must be quite a common question and I am sorry if the answer has already been posted somewhere, but after a good look all over this website and several other websites I still am not sure whether there is a way for me to avoid 'for' loops in my case. So here is part of my code which I am trying to vectorize:
G=zeros(t_max+1,9); %each column represents the proportion of people using something numbered 1 to 9. So: sum(G,2)=1
P=zeros(t_max+1,4); %each column represents the proportion of people using either item 1, 2, 3 or 4. So: sum(P,2)=1
SS=[1 1 2 1 1 2 3 3 4]; %each number corresponds to each column of P (item 1 to 4)
I=[a b c d e f g h i]; %with a to i, 9 preallocated numbers (basically initial proportion values)
G(1,:)=[I];
for t=1:t_max
%G(t+1,:) is updated but not shown here
for ii=1:4 %columns of P
for jj=1:9 %columns of G
if SS(jj)==ii
P(t+1,ii)=P(t+1,ii)+G(t+1,jj);
end
clear jj;
end
clear ii;
end
end
Basically in plain english (well I will try my best explaining it), at each time step 't' I am updating the proportion in 'P' which is a sum of specific proportions in 'G' (I have not shown this but G(t+1,:) is calculated before the loop). Each proportion of P is updated depending on which column of P the numbers in 'SS' are specifying to. So if SS(:,6) specifies 2, we know that the proportion in the sixth column of G will be added to second column of P (cumulative sums). (I think that might be even less understandable so if you have any question just ask me).
Sorry for the really long post and hopefully someone will be able to tell me if I really need all these 'for' loops or if I can simplify it using vectorization.
Thank you!
Regards
Jonathan
댓글 수: 3
Adam
2016년 1월 22일
I'm afraid I don't have time to consider it in enough detail though if someone else hasn't answered when I next have a spare moment I will take a look.
What caused me to rely though is to ask why do you have
clear jj
in the middle of a loop?! I have never tried it so I don't know what the effect is, but I cannot imagine it being a good effect. It would either mess up the loop entirely or do nothing if the loop variable is kept track of behind the scenes anyway (I'm not sure of the exact mechanics of how that works).
As is effectively it does nothing; the variable does disappear for the time between there and the next iteration but it then will be recreated and will have the proper value as the for expression is evaluated prior to the loop and not reevaluated.
That said, it is "poor practice" and should be avoided. Both of those clear statements should be deleted by OP simply as being unneeded and unwise.
Jonathan E.
2016년 1월 25일
채택된 답변
추가 답변 (1개)
Jonathan E.
2016년 1월 25일
댓글 수: 2
Kirby Fears
2016년 1월 26일
Is SS the same as before? I would guess W is indexed with W(ii,jj), not W(SS(ii),SS(jj)). Please confirm and I can try to vectorize this.
Kirby Fears
2016년 1월 26일
Here is a simplification assuming W(ii,jj) was the proper indexing.
G = [0.2 0.1 0.05 0.05 0.1 0.3 0.1 0.05 0.05];
W = rand(numel(G));
E = zeros(size(G));
for ii = 1:numel(E),
E(ii) = E(ii) + sum(G(ii)*G.*W(ii,:));
end
Here is the same thing with matrix multiplication instead.
G = [0.2 0.1 0.05 0.05 0.1 0.3 0.1 0.05 0.05];
W = rand(numel(G));
E = G.*(G*W');
카테고리
도움말 센터 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!