Complicated for loops structuring

1 Ansicht (letzte 30 Tage)
Jonathan Cheong
Jonathan Cheong am 22 Mär. 2021
Beantwortet: Jonathan Cheong am 23 Mär. 2021
Hello, this is a question for the pros, and feel free to only answer if it interest you.
I have this code which helps me model data for each independent event.
% Event 1
sm1 = smcellere{1,:}; t1 = 1:length(sm1);SMF_1 = (1:0.3:SMO(1));good1 = sm1(~isnan(sm1)).';
figure(1)
plot(t1,sm1,'--ob');
hold on
for i = 1:length(SMF_1)
for ii = 1:length(tau)
% This is the model
SM1 = (SMO(1)-SMF_1(i))*exp(-t1./tau(ii))+SMF_1(i);
rmse1(i,ii) = sqrt(sum((SM1-good1).^2)/length(good1));
end
end
[iii,jjj] = find(rmse1 == min(rmse1(:)));
smf1=SMF_1(iii);tau1 = tau(jjj);
sm1calc = (SMO(1)-smf1)*exp(-t1./tau1)+smf1;
plot(t1,sm1calc,'-or');
hold off
% Event 2
sm2 = smcellere{2,:}; t2 = 1:length(sm2);SMF_2 = (1:0.3:SMO(2));good2 = sm2(~isnan(sm2)).';
figure(2)
plot(t2,sm2,'--ob');
hold on
for ai = 1:length(SMF_2)
for aii = 1:length(tau)
SM1 = (SMO(2)-SMF_2(ai))*exp(-t2./tau(aii))+SMF_2(ai);
rmse2(ai,aii) = sqrt(sum((SM1-good2).^2)/length(good2));
end
end
[aai,aaj] = find(rmse2 == min(rmse2(:)));
smf2=SMF_2(aai);tau2 = tau(aaj);
sm2calc = (SMO(2)-smf2)*exp(-t2./tau2)+smf2;
plot(t2,sm2calc,'-or');
hold off
Now, the code is long, and this is only for 2 events. I have 34 events to go through, which I would be doing manually nonetheless if I can't figure out an algorithm to plot every event automatically. Furthermore, a working algorithm can help me cross check my answers.
This is what I'm trying to achieve by meshing everything into a single algorithm:
% Each event is represented as data in each row of cell
% Iterate through each event
for i = 1:length(smcellere)
sm = smcellere{i,:};
% The duration of event is denoted as t
t = 1:length(sm);
% SMO is the 1st data point for each row/event, and SMF is the interval
SMF = (1:0.3:SMO(i));
% Iterate through each data of SMF
for ai = 1:length(SMF)
% Iterate through each day in a year (tau)
for aii = 1:length(tau)
% Plot the initial graph of observed data for each event
figure, plot(t,sm,'--ob');
hold on
% This is the exponential model. Run this model for each
% day in tau and each point in SMF
SM = (SMO(i)-SMF(ai))*exp(-t./tau(aii))+SMF(ai);
for gi = 1:length(SM)
for ki = t
% Calculate Root Mean Square Error to plot as line of
% best fit
rmse(ai,aii) = sqrt(sum((SM(gi)-sm(ki)).^2)/length(sm(ki)));
% THis is the best RMSE
[aai,aaj] = find(rmse == min(rmse(:)));
smf=SMF(aai);tau2 = tau(aaj);
% Calculate the model results
smcalc = (SMO(i)-smf)*exp(-t./tau2)+smf;
end
end
end
end
% Plot line of best fit
plot(t,smcalc,'-or');
hold off
end
The problem is, I can't do trial and error with this because my computer will just freeze due to bad coding.
Thanks in advance for any who'd like a challenge.
  2 Kommentare
Jonathan Cheong
Jonathan Cheong am 22 Mär. 2021
Cool, I've tried a few ways and am happy I'm finally one step closer. The code works perfectly, but only for the first 12 events. At event 13 it gives me an error:
"Index exceeds the number of array elements"
And I can't figure out why. I suspect the problem is marked with (*) , but do not know how to solve it.
smtmp = smcellere(:);
for i = 1:length(smtmp)
sm = smtmp{i,:}.';
t = 1:length(sm);
SMF = (1:0.1:SMO(i));
good = sm(~isnan(sm)).';
figure, plot(t,sm,'--ob');
hold on
for ai = 1:length(SMF)
for aii = 1:length(tau)
SM = (SMO(i)-SMF(ai))*exp(-t./tau(aii))+SMF(ai);
% **rmse(ai,aii) = sqrt(sum((SM-sm).^2)/length(sm));**
end
end
[aai,aaj] = find(rmse == min(rmse(:)));
% if aai > length(SMF)
% smf=SMF(length(SMF));tau2 = tau(aaj);
% elseif aai < length(SMF)
smf=SMF(aai);tau2 = tau(aaj);
% end
smcalc = (SMO(i)-smf)*exp(-t./tau2)+smf;
plot(t,smcalc,'-or');
hold off
end
Any input is much appreciated.
darova
darova am 22 Mär. 2021
I don't see rmse preallocation. Did you define size of the variable?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jonathan Cheong
Jonathan Cheong am 23 Mär. 2021
Thanks this works perfectly.
smtmp = smcellere(:);
for i = 1:length(smtmp)
sm = smtmp{i,:}.';
t = 1:length(sm);
SMF = (1:0.1:SMO(i));
figure, plot(t,sm,'--ob');
hold on
rmse = zeros(size(SMF,1),length(tau));
for ai = 1:length(SMF)
for aii = 1:length(tau)
SM = (SMO(i)-SMF(ai))*exp(-t./tau(aii))+SMF(ai);
rmse(ai,aii) = sqrt(sum((SM-sm).^2)/length(sm));
end
end
[aai,aaj] = find(rmse == min(rmse(:)));
smf=SMF(aai);tau2 = tau(aaj);
smcalc = (SMO(i)-smf)*exp(-t./tau2)+smf;
plot(t,smcalc,'-or');
hold off
end

Weitere Antworten (0)

Kategorien

Mehr zu 2-D and 3-D Plots finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by