Getting rid of a loop

3 views (last 30 days)
Danielle Leblance
Danielle Leblance on 9 Nov 2016
Edited: Jan on 10 Nov 2016
Hi,
I have a loop that takes forever. I am wondering if i can get rid of it by using a one step procedure
[yd,md,dd]=datevec(RSSD9999d);%RSSD9999d is the dates vector for my sample
[y,m,~]=datevec(RSSD9999);% RSSD9999 is the dates vector from the database > sample size
for i=1:length(RSSD9001d)% I am running the loop to compute the previous 3 year historical average
x0=find(RSSD9001==RSSD9001d(i) & ismember(RSSD9999,[datenum(yd(i)-3,md,dd):RSSD9999d(i)-1]));
% the minus one is not a mistake, the data has the form year, then quarter (could be 3,6,9,or 12), then day
% by putting minus 1 i ensure that the 3 year average will not include the current date
EquityCapitalgta = RCFD3210(x0)./GTA(x0);
EquityCapital_GTAavg3y(i,1)=nanmean(EquityCapitalgta);
end

Accepted Answer

Jan
Jan on 10 Nov 2016
Edited: Jan on 10 Nov 2016
Did you pre-allocate the output?
EquityCapital_GTAavg3y = zeros(1, length(RSSD9001d))
Use the profiler to find out, how many time is spent in datenum . If this matters, replace it.
ismember sorts its inputs. Try to sort it at first an call ismembc (see code of ismember.
This part:
ismember(RSSD9999,[datenum(yd(i)-3,md,dd):RSSD9999d(i)-1]))
might be accelerated by:
RSSD9999>=datenum(yd(i)-3,md,dd) && RSSD9999 <= RSSD9999d(i)-1
The names of your variables are horrifying. It is really hard to read your code. Note that a working algorithm does not depend on the meaning of the variables, so you could use some leaner names.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!