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

Fehler bei logical Indexing

 

tobsn
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2013, 11:16     Titel: Fehler bei logical Indexing
  Antworten mit Zitat      
Hallo Zusammen,

ich habe einen logical index Fehler der wohl mit einer Schleife zusammenhängt, da der Code funktioniert wenn ich das ganze manuell durchführe.
Folgendes soll passieren:
Es wird eine Matrix die Spaltenweise mittels cumsum kumuliert wird auf Werte in den Spalten untersucht. Wird dabei eine Symmetrische Grenze (+/- 0.05) getroffen oder überschritten soll in der jeweiligen Spalte ab i+1 neu kumuliert werden.
Das komische ist, dass es für die erste Spalte perfekt funktioniert aber nicht für die anderen Spalten und dass für die anderen Spalten der ermittelte Spaltenindex aus Spalte eins verwendet wird. Es soll aber jede Spalte einen individuellen Spaltenindex haben der in einem Zeilenvektor gespeichert wird.

Hier mein Code:
Code:


T = 3541,
N = 13;

 % Exposure Matrices
    EXP_Curr = zeros(T,N);
    Diff_EXP_Curr = zeros(T,N);
    EXP_Portf = zeros(T,1);
    Cum_Portf_EXP = zeros(T,1);
    Cum_Curr_EXP = zeros(T,N);
    EXP_Portf_reset = 1;
    EXP_Curr_reset(1,1:N) = 1;
    C = zeros(T,N);

for i=1:T
%Exposure
    %Exposure per currency per day: Days x Currencies
    %Histweights_LCY und CurrencyMatrix werden vorbestimmt und sind definitiv fehlerfrei
    EXP_Curr(i,:) = HistWeights_LCY(i,:) * CurrencyMatrix';    
   
     if i >= 2 && i <= T-1
       
        %Exposure difference per day
        Diff_EXP_Curr(i,:) = diff(log(EXP_Curr(i - 1:i,:))).*EXP_Curr(i - 1,:);
       
        %Total Portfolio Exposure per day
        EXP_Portf(i,:) = sum(Diff_EXP_Curr(i,:),2);

        %Cumulative Portfolio Exposure per day
        Cum_Portf_EXP(EXP_Portf_reset:end,:) = cumsum(EXP_Portf(EXP_Portf_reset:end,:));

        %Cumulative Exposure per Currency
        Cum_Curr_EXP(EXP_Curr_reset:end,:) = cumsum(Diff_EXP_Curr(EXP_Curr_reset:end,:),1);

        %Logical Matices
       
        %rebalance all currencies
        if abs(Cum_Portf_EXP(i,1)) >= cut_off
            EXP_Portf_reset = i;
        end

        %rebalance single currencies
        %why does only pos eight not work??
        CurrExpBreach = abs(Cum_Curr_EXP(i,:)) >= cut_off;
        C(i,:) = logical(abs(Cum_Curr_EXP(i,:)) >= cut_off);
        EXP_Curr_reset(1,logical(C(i,:))) = i + 1;
       
   
     end
 
end
 


Über Hilfe würde ich mich sehr freuen!

VG
Tobi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.10.2013, 18:13     Titel:
  Antworten mit Zitat      
Hallo,

bei der Menge an Code hilft es, wenn du eingrenzt, wo genau das Problem auftritt.

Verstehe ich es richtig, dass es keine Fehlermeldung ist sondern ein unerwartetes, falsches Ergebnis?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
tobsn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.10.2013, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

ja genau ich bekomme nicht die gewünschten Ergebnisse..

Der Fehler müsste in diesem Bereich liegen:
Code:
%Cumulative Exposure per Currency
Cum_Curr_EXP(EXP_Curr_reset:end,:) = cumsum(Diff_EXP_Curr(EXP_Curr_reset:end,:),1);
 


Ich denke dass ich so nicht indizieren kann, leider weiß ich aber nicht wie es richtig gemacht wird.
Mein Zeilen Vektor "EXP_Curr_reset" enthält am Anfang lauter Einsen, sobald in einer Spalte von "Cum_Curr_EXP" meine Grenze getroffen wird, soll in der entsprechenden Spalte in ""EXP_Curr_reset" der Zeilenindex die vorherige Zahl überschreiben (das passiert weiter unten im Code). Und dann soll bei der nächsten Iteration für die entsprechende Spalte in "Cum_Curr_EXP" ab dem in "EXP_Curr_reset" gespeicherten Zeilenindex bis zum Ende kumuliert werden. Es kann also durchaus vorkommen, dass innerhalb einer Iteration z.B.: Spalte 1 von Zeile 30-300 kumuliert wird, Spalte 2 von 1-300, Spalte 3 von 89-300, usw..

Verstanden was ich meine?

Vielen Dank!

Tobi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.10.2013, 20:52     Titel:
  Antworten mit Zitat      
Hallo,

nein, ich verstehe die Beschreibung nicht.

Du verwendest (vektor:end) als Index. Sollte da vielleicht ein i rein? Das würde erklären, warum es für die erste Spalte funktioniert, ansonsten aber nicht.
Gegenwärtig wird immer nur das erste Element von vektor berücksichtigt, was wohl nicht in deiner Absicht ist.
Code:
(1:5):10
(3:5):10


Grundsätzlich ist meine Empfehlung, zunächst mal funktionierenden, nicht ganz so "eleganten" Code zu schreiben. Wie man den Code dann schöner gestaltet, kann man sich danach immer noch überlegen.

Grüße,
Harald
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.