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

Bedingte Kumulierung einzelner Spalten

 

tobsn
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2013, 13:41     Titel: Bedingte Kumulierung einzelner Spalten
  Antworten mit Zitat      
Hallo Zusammen,

folgendes Problem:
Ich habe eine Matrix n X m, nun sollen für jede Spalte m die einzelnen Werte in der Spalte solange aufkumuliert werden bis ein bestimmter Wert überschritten wird. Trifft dies zu soll der nächste Wert nach überschreiten besagter Grenze Null sein. Dann soll das ganze in eine Zeile weiter wie die Null neu starten.
Das ganze soll in jeder Spalte durchgeführt werden, wobei die "Nullen" meistens nicht in der gleichen Zeile stehen stehen...

Ich komme nicht weiter..

Bitte um Hilfe!

Besten 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: 10.10.2013, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

wie sollen die Werte kumuliert werden? Summe, Produkt, ganz was anderes?
Im Fall von Summe: sind die Werte alle nichtnegativ?

Sieht in jedem Fall nach cumsum/cumprod aus.

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: 10.10.2013, 14:07     Titel:
  Antworten mit Zitat      
cumsum.. aber das ist ja nicht das Problem...

Es soll eben für jede einzelne Spalte mehrere verschieden lange "cumsum" geben die an unterschiedlichen Stellen in der jeweiligen Spalte starten und enden..
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: 10.10.2013, 14:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Es soll eben für jede einzelne Spalte mehrere verschieden lange "cumsum" geben die an unterschiedlichen Stellen in der jeweiligen Spalte starten und enden..

Das ist mir schon klar. Ich würde trotzdem mit cumsum anfangen.

Bitte auch folgende Frage beantworten:
Zitat:
Im Fall von Summe: sind die Werte alle nichtnegativ?


Zudem interessant: was sind typische Werte von m und n, damit man eine Vorstellung hat, wie groß die Matrix wird?

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: 10.10.2013, 14:37     Titel:
  Antworten mit Zitat      
Die Werte sind sowohl positiv als auch negativ.
Ich betrachte allerdings den Betrag des kumulierten Wertes, da ich einen Symmetrische Grenze habe.
die Werte sind sehr klein.. Meine Input Matrix ist 3541x13.
Die symmetrische Grenze beträgt +/-0.05.

Gibt es denn ein Möglichkeit in einer Spalte immer von einer bis zur nächsten Null zu kumulieren?
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: 10.10.2013, 14:37     Titel: Re: Bedingte Kumulierung einzelner Spalten
  Antworten mit Zitat      
Hallo tobsn,

Zitat:
Ich habe eine Matrix n X m, nun sollen für jede Spalte m die einzelnen Werte in der Spalte solange aufkumuliert werden bis ein bestimmter Wert überschritten wird.

Für ein Computer-Programm muss man dies eindeutig definieren: Einschließlich oder ausschließlich bis zu dem Wert, der das Limit überschreitet?

Zitat:
Dann soll das ganze in eine Zeile weiter wie die Null neu starten.

Das verstehe ich nicht.

Zitat:
Ich komme nicht weiter..

Wie immer wäre es hilfreich, wenn Du zeigst, was Du bisher gemacht hast und wo genau es noch hakt. Möglicherweise muss ja nur eine Zeile geändert werden.

Ich würde mit einer einfachen FOR-Schleife beginnen. CUMSUM ist zwar sicherlich schneller, aber wegen der Ausnahmen auch komplizierter anzuwenden. Es bringt ja nichts, wenn es 10 Sekunden schneller läuft, aber man eine Stunde mehr Zeit zum Programmieren verwendet.

Gruß, Jan
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: 10.10.2013, 15:25     Titel:
  Antworten mit Zitat      
Hier mein Code:

Code:

T = 3541;
cut_off = 0.05;

for i = 1:T
    %Exposure
    %Exposure per currency per day: Days x Currencies
    EXP_Curr(i,:) = HistWeights_LCY(i,:) * CurrencyMatrix';    
   
    if i >= 2 && i <= T-1
       
       
       
        %Exposure difference per day
        Diff_EXP_Curr(i-1,:) = diff(log(EXP_Curr(i-1:i,:))).*EXP_Curr(i-1,:);

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

        %Logical Matices
       
        CurrExpBreach = abs(Cum_Curr_EXP(i-1,:)) >= cut_off;
        Diff_EXP_Curr(i,CurrExpBreach) = 0;
        Cum_Curr_EXP(i:end,CurrExpBreach) = cumsum(Diff_EXP_Curr(i+1:end,CurrExpBreach),1);

    end
end
 


Der Code soll folgendes machen:
Zunächste wird für Tag i die Exposure berechnet.
Falls i => 2, also bereits für den zweiten Tag die Exposure berechnet wurde, soll die gewichtete Differenz zwischen dem aktuellen und dem Vortag berechnet werden.
Dann soll vom ersten Tag (i=1; also hier i-1) beginnend für jeden Tag die kumulative Summe seit Tag 1 berechnet werden.
Dann soll geprüft werden ob in Zeile i-1 ein Wert der Spalten die Grenze trifft oder überschreitet. Ist dies der Fall soll in der Differenz Matrix Diff_EXP_Curr der Wert der Spalte in der aktuellen Zeile auf Null gesetzt werden.
Und im nächsten Schritt soll für diese Spalte ab der eingetragenen Null neu aufkumuliert werden.

Ich hoffe es ist einigermaßen verständlich was passieren soll...
Sonst bei einfach Fragen!

DANKE!
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: 10.10.2013, 16:11     Titel:
  Antworten mit Zitat      
Hallo,

macht der Code denn das, was er soll?
Wenn nein, in welcher Hinsicht nicht?

Hier ein Versuch meinerseits:
Code:
M = 0.001*randn(3541,13);
Mc = cumsum(M);
for J = 1:size(Mc,2) % loop over columns
    startidx = 1;
    cont_search = true;
    while cont_search
        firstoutside = find(abs(Mc(startidx:end,J))>0.05, 1, 'first');
        if ~isempty(firstoutside)
            firstoutside = startidx - 1 + firstoutside;
            Mc(firstoutside:end,J) = Mc(firstoutside:end,J) - Mc(firstoutside, J);
            startidx = firstoutside + 1;
        else
            cont_search = false;
        end
    end
end


Du solltest auf jeden Fall überprüfen, ob das auch genau das macht, was du möchtest. Dafür übernehme ich nämlich keine Verantwortung.

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: 10.10.2013, 16:36     Titel:
  Antworten mit Zitat      
Danke für deine Antwort!

Dein Code macht fast das was er soll... allerdings verstehe ich ihn nicht.. von daher wird es schwer in zu implementieren.
Dein code setzt die zahl die die grenze überschreitet auf null. Es soll aber erst die nächste zahl null sein. Das ist der einzige fehler der mir soweit auffällt.

Kannst du mir erklären wie dein code vorgeht?

Danke!
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: 10.10.2013, 17:22     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dein code setzt die zahl die die grenze überschreitet auf null. Es soll aber erst die nächste zahl null sein.

Das solltest du leicht anpassen können :)

Zitat:
Kannst du mir erklären wie dein code vorgeht?

Hier nochmal kommentiert:
Code:
M = 0.001*randn(3541,13);
Mc = cumsum(M);

% loop over columns
for J = 1:size(Mc,2)

    % Always start at beginning of column
    startidx = 1;
    cont_search = true;
   
    % Keep searching until stopped
    while cont_search
       
        % Find next position to set to 0
        firstoutside = find(abs(Mc(startidx:end,J))>0.05, 1, 'first');
        if ~isempty(firstoutside)
           
            % Make the index 1-based again
            firstoutside = startidx - 1 + firstoutside;
           
            % Subtract this value from all following ones
            % This is equivalent to restarting the cumulative sum
            Mc(firstoutside:end,J) = Mc(firstoutside:end,J) - Mc(firstoutside, J);
           
            % For the next iteration, start looking at the next element
            startidx = firstoutside + 1;
        else
            % Stop searching
            cont_search = false;
        end
    end
end


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: 11.10.2013, 19:59     Titel:
  Antworten mit Zitat      
danke
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.