Efficient memory allocation for MonteCarlo simulation

Hi, I am a beginner with Matlab and have an issue, maybe someone can help I need to perdorm a MC simulation, I have data for 8760 hours (1 year), i need to create a normal distribution for a variable Vf, and run the code at least 10000 times,
The code is like
n=10000;
L=length(data_es1);
for i=1:1:n
%L is 8760, data_es1(j,2) is the mean while data_es1(j,12) is st.deviation
for j=1:1:L
Vf(j,i)=data_es1(j,2)+data_es1(j,12).*randn;
end
This would create a 10000x8760 matrix, that is very big, and I have several variables to manage in this way (Vf plus at least 5 others), I have encourred a "out of memory" problem,
Any idea to run the code smarter and save memory/busy problems?
Thank you
Alex

6 Comments

You can skip the second loop and write as..
Vf(:,i)=data_es1(:,2)+data_es1(:,12).*randn(8760,1);
In fact you need not to use loops at all..you can do matrix multiplication completely. Where/How you have the data data_es1?
Is Vf pre-allocated before the loop?
Thenk you KKSV, I Will try this. Data_es1 are imported in the workspace from excel,Vf is pre allocated
While the vectorized solution will run faster, it won't help on the memory problem -- in fact the second suggestion would create yet another 10K*8760 array; it would need every random variable at one time for every simulation.
The memory savings would have to come from being able to compute what it is you need from the vf variable for each iteration instead of saving every iteration to the end of the loop over the number of simulations.
Yes, the code proposed was faster but I had still the mempry problem... I Will try to calculate only the necesary variables. Thanks again
Again: Is Vf pre-allocated before the loop?

Sign in to comment.

Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Asked:

on 20 Oct 2017

Commented:

Jan
on 20 Oct 2017

Community Treasure Hunt

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

Start Hunting!