for iWS=iWSPosFound:size(obj.SignalWeekly,1) if obj.ts(iTS,1)==obj.SignalWeekly(iWS,1)
obj.Signal(iTS,2)=obj.SignalWeekly(iWS,2);
iWSPosFound=iWS;
break;%Exit loop
end end
Obiger Code verbrät beim if-Statment extrem viel Zeit. Der Wert aus obj.ts ist stets ein integer-Wert, der aus obj.SignalWeekly kann sowohl ein integer-Wert als auch ein NaN sein.
Hat jemand eine Idee?
Vielen Dank für eure Hilfe!
Lloyd
vielen Dank für deinen Tipp. Ich habe die Sache nun etwas anders gelöst:
alter Code:
Code:
%% Signal function CalcSignal(obj) ifisempty(obj.SignalWeekly)==1
CalcSignalWeekly(obj);
end
obj.Signal=obj.ts(:,1);%Date column
obj.Signal=[obj.Signal,zeros(size(obj.Signal,1),1)];%Expand the matrix
iWSPosFound=1;%Init
for iTS=1:size(obj.ts,1)
obj.Signal(iTS,2)=NaN;
for iWS=iWSPosFound:size(obj.SignalWeekly,1) if obj.ts(iTS,1)==obj.SignalWeekly(iWS,1)
obj.Signal(iTS,2)=obj.SignalWeekly(iWS,2);
iWSPosFound=iWS;
break;%Exit loop
end end end end
function CalcSignal(obj) ifisempty(obj.SignalWeekly)==1
CalcSignalWeekly(obj);
end
obj.Signal=obj.ts(:,1);%Date column
obj.Signal=[obj.Signal,zeros(size(obj.Signal,1),1)];%Expand the matrix
[tf, pos]=ismember(obj.ts(:,1),obj.SignalWeekly(:,1));
for i=1:size(tf,1) iftf(i)
obj.Signal(i,2)=obj.SignalWeekly(pos(i),2);
else
obj.Signal(i,2)=NaN;
end end end
Doch, das ist so gewollt! obj ist eine Struktur, welche diverse Zeitreihen besitzt. Da Signal SignalWeekly benötigt, wird hier geprüft ob diese Zeitreihe bereits mit Werten beschrieben wurde. Falls nein, wird die Funktion CalcSignalWeekly aufgerufen und dies erledigt.
der Wert von "obj" verändert wird. Ist in CalcSignalWeekly vielleicht ein häßliches ASSIGNIN versteckt? Ansonsten wird zwar in CalcSignalWeekly das Feld "SignalWeekly" geschrieben, aber mangels Rückgabe ist davon innerhalb der geposteten Funktion nichts zu spüren.
der Wert von "obj" verändert wird. Ist in CalcSignalWeekly vielleicht ein häßliches ASSIGNIN versteckt? Ansonsten wird zwar in CalcSignalWeekly das Feld "SignalWeekly" geschrieben, aber mangels Rückgabe ist davon innerhalb der geposteten Funktion nichts zu spüren.
Das funktioniert so:
Code:
function CalcSignalWeekly(obj) ifisempty(obj.BufuAtDateRollingVolatility)==1
CalcBufuAtDateRollingVolatility(obj);
end ifisempty(obj.CTDDuration)==1
CalcCTDDuration(obj);
end
tmpSignal=zeros(size(obj.BufuAtDateRollingVolatilityWeight))';
obj.SignalWeekly=obj.DatesExHolidays;%Date column
obj.SignalWeekly=[obj.SignalWeekly,zeros(size(obj.SignalWeekly))];%Expand the matrix
for iBufuAtDate=1:size(obj.SignalWeekly,1) ifisnan(obj.SignalWeekly(iBufuAtDate,1))==0 break;%Exit loop
end
obj.SignalWeekly(iBufuAtDate,2)=NaN;
end for iBufuAtDate=iBufuAtDate:size(obj.SignalWeekly,1) ifisnan(obj.BufuAtDateRollingPerformance(iBufuAtDate+obj.BufuAtDateRollingVolatility_RollingPeriod_Indicator,2))==1 break;%Exit loop
end for j=2:size(obj.BufuAtDateRollingVolatility,2) ifabs(obj.BufuAtDateRollingPerformance(iBufuAtDate,j))/(obj.CTDDuration(iBufuAtDate,2)/100)>=obj.BufuAtDateRollingVolatilityWeight(j-1)*obj.BufuAtDateRollingVolatility(iBufuAtDate,j) if obj.BufuAtDateRollingPerformance(iBufuAtDate,j)<=0
tmpSignal(j-1)=1;
else
tmpSignal(j-1)=-1;
end else
tmpSignal(j-1)=0;
end end
obj.SignalWeekly(iBufuAtDate,2)=roundUPDOWN(-tmpSignal*obj.BufuAtDateRollingPerformanceWeight/obj.Step,0)*obj.Step;
end for iBufuAtDate=iBufuAtDate:size(obj.SignalWeekly,1)
obj.SignalWeekly(iBufuAtDate,2)=NaN;
end end
SignalWeekly ist eine Zeitreihe im Objekt obj und wird durch aufrufen von CalcSignalWeekly berechnet.
Gruß,
Lloyd
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.