WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Performanceproblem

 

Lloyd Blankfein
Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 10:03     Titel: Performanceproblem
  Antworten mit Zitat      
Hallo,

Code:

                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
Private Nachricht senden Benutzer-Profile anzeigen


Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 02.05.2012, 10:55     Titel:
  Antworten mit Zitat      
Kenne mich mit OO-Programmierung in Matlab nicht aus, würde denn sowas
Code:
indexe= (obj.ts(:,1)==obj.SignalWeekly(:,1))

gehen?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Lloyd Blankfein
Themenstarter

Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2012, 13:25     Titel:
  Antworten mit Zitat      
Hallo Andy,

vielen Dank für deinen Tipp. Ich habe die Sache nun etwas anders gelöst:

alter Code:
Code:

        %% Signal
        function CalcSignal(obj)
            if isempty(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
 


neuer Code:
Code:

        function CalcSignal(obj)
            if isempty(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)
                if tf(i)
                    obj.Signal(i,2)=obj.SignalWeekly(pos(i),2);
                else
                    obj.Signal(i,2)=NaN;    
                end
            end    
        end
 


Diese Lösung ist natürlich weitaus schneller & eleganter. Keine Ahnung was mich damals geritten hatte Shocked

Gruß,
Lloyd
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.05.2012, 11:51     Titel:
  Antworten mit Zitat      
Hallo Lloyd Blankfein,

Code:

        function CalcSignal(obj)
            if isempty(obj.SignalWeekly)==1
                CalcSignalWeekly(obj);
                % Kein output?! Vielleicht:
                % obj = CalcSignalWeekly(obj);
            end

            obj.Signal = obj.ts(:, 1); %Date column
            [tf, pos]=ismember(obj.Signal, obj.SignalWeekly(:,1));          

            obj.Signal(:, 2) = NaN;
            obj.Signal(tf, 2) = obj.SignalWeekly(pos, 2);    
        end
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lloyd Blankfein
Themenstarter

Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2012, 13:08     Titel:
  Antworten mit Zitat      
Hallo Jan,

hier kommt es zu dieser Fehlermeldung:

Zitat:

??? Subscript indices must either be real positive integers or logicals.

Error in ==> DMClassic>DMClassic.CalcSignal at 246
obj.Signal(tf, 2) = obj.SignalWeekly(pos, 2);


Code:

            if isempty(obj.SignalWeekly)==1
                CalcSignalWeekly(obj);
                % Kein output?! Vielleicht:
                % obj = CalcSignalWeekly(obj);
            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.

Gruß,
Lloyd
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.05.2012, 23:01     Titel:
  Antworten mit Zitat      
Hallo Lloyd Blankfein,

Zitat:
??? Subscript indices must either be real positive integers or logicals.

Error in ==> DMClassic>DMClassic.CalcSignal at 246
obj.Signal(tf, 2) = obj.SignalWeekly(pos, 2);

Nun, da ich deine Daten nicht habe, kann ich da nicht testen. Du solltest dies aber mit Hilfe des Debuggers schaffen.
Versuche es mit:
Code:
obj.Signal(tf, 2) = obj.SignalWeekly(pos(tf), 2);


Ich sehe immer noch nicht, wie in der Zeile
Code:
CalcSignalWeekly(obj);

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.

Gruß, Jabn
Private Nachricht senden Benutzer-Profile anzeigen
 
Lloyd Blankfein
Themenstarter

Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2012, 10:03     Titel:
  Antworten mit Zitat      
Wow,

Code:

        function CalcSignal(obj)
            if isempty(obj.SignalWeekly)==1
                CalcSignalWeekly(obj);  
            end
            obj.Signal = obj.ts(:, 1); %Date column
            [tf, pos]=ismember(obj.Signal, obj.SignalWeekly(:,1));          
            obj.Signal(:, 2) = NaN;
            obj.Signal(tf, 2) = obj.SignalWeekly(pos(tf), 2);  
        end
 


Die Funktion ist jetzt um den Faktor 25 schneller Very Happy !

Zitat:

Ich sehe immer noch nicht, wie in der Zeile
Code:

CalcSignalWeekly(obj);  
 

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)
            if isempty(obj.BufuAtDateRollingVolatility)==1
                CalcBufuAtDateRollingVolatility(obj);
            end
            if isempty(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)
                if isnan(obj.SignalWeekly(iBufuAtDate,1))==0
                    break;%Exit loop
                end
                obj.SignalWeekly(iBufuAtDate,2)=NaN;
            end
            for iBufuAtDate=iBufuAtDate:size(obj.SignalWeekly,1)
                if isnan(obj.BufuAtDateRollingPerformance(iBufuAtDate+obj.BufuAtDateRollingVolatility_RollingPeriod_Indicator,2))==1
                    break;%Exit loop
                end
                for j=2:size(obj.BufuAtDateRollingVolatility,2)
                    if abs(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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.