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...
Es soll eben für jede einzelne Spalte mehrere verschieden lange "cumsum" geben die an unterschiedlichen Stellen in der jeweiligen Spalte starten und enden..
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?
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?
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.
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!
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.
% 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
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.