ich habe folgendes Problem:
Ich muss in meinen Berechnungen immer wieder abfragen, welcher der letzte bzw. nächste Wert der gültige für meine Berechnung ist. Dazu ein kleines Beispiel:
Nun zu meinen Berechungen:
Für jede Zeile möchte ich nun einen Wert Berechnen der sich wie folgt ergibt. Steht in Spalte 1 ein gültiger Wert, dann wird dieser Werte genommen und mit dem Wert aus Spalte 4 verrechnet:
Code:
for k=1:size(A)-1 if isfinite(A(k,1))
A(k,5)=(A(k,1)/1000)*A(k,4) end end
Sind nun in Spalte 1 NaNs dabei steht in Spalte 5 in den entsprechenden Zeilen eine "0".
Daher möchte ich hergehen und an diesen Stellen die Werte für Spalte 5 mit den zuletzt/nächsten gültigen Wert berechnen:
Code:
for k=1:size(A)-1 ifisnan(A(k,1))
A(k,5)= ((letzer gültiger Wert)+(nächster gültiger Wert))/1000*A(k,4) end end
Hintergrund ist folgender: Würde man immer nur den letzten und den nachfolgenden Wert bei Zeilen mi NaN in Spalte 1 verwenden, würde an Stellen wo 2 oder 3 oder mehr NaNs in der 1. Spalte auftauchen sofort Fehler auftreten und in Spalte 5 kein Wert ermittelt werden können.
Nun meine Frage: Ist es möglich innerhalb der Berechnungsschleife diese Abfrage einzubauen, welcher der letzte und welcher der nächte gültige Wert ist?
Ich hoffe mir kann jemand dabei helfen.
Vielen Dank.
es wäre bei sowas immer nett, den code so vorzubereiten, dass man ihn direkt benutzen kann. Dazu gehört, dass das Dezimaltrennzeichen ein Punkt ist und NaN immer NaN geschrieben wird und nicht Nan. Dann kann man da direkt anfangen, ohne noch diese Sachen selbst ersetzen zu müssen.
Zum Problem:
Zitat:
Sind nun in Spalte 1 NaNs dabei steht in Spalte 5 in den entsprechenden Zeilen eine "0".
Ja, weil Matlab weiß, dass Matrizen rechteckig sein müssen und füllt daher den Rest der Spalte 5 mit Nullen auf, sobald irgendwo ein Wert reingeschrieben wird.
Mir ist zumindest dein erklärtes Vorgehen nicht wirklich klar. Es wird am Ende immer mit dem Wert aus der vierten Spalte multipliziert, auch wenn da ein NaN steht?
Was passiert für k = 18, wenn überall NaN steht?
Vielleicht so
Code:
valid = not(isnan(A));
A(:,5) = NaN; %Vorschlag zunächst überall NaN(oder Null?) for k = 1:size(A,1) % alle gültigen Indizes
idx = find(valid(k,1:3));
ifany(idx) % Nur erste Spalte nehmen, sofern möglich if idx(1) == 1
idx = 1;
end end
A(k,5) = sum(A(k,idx))/1000*A(k,4);
end
zunächst entschuldigt bitte für die fehlerhafte und unzureichende Darstellung meines Problems. Hier nochmals ausführlich und hoffentlich verständlich.
Als Ausgangsmatrix habe ich ungefähr dieses hier:
Nun kommt er schwierige Teil: Zunächst soll in der zugehörigen Zeile der Spalte 5 ein NaN stehen, wenn in einer Zeile jeweils in den Spalten 1-4 auch ein NaN steht.
Für Zeilen, bei denen in Spalte 3 ein gültiger Wert steht (10000, 160000, 16000) soll der zu berechnende Wert für Spalte 5 wie folgt errechnet werden:
Den zuletzt gültigen Wert aus Spalte 1 und dem nächsten gültigen Wert aus Spalte 1 addieren, anschließend halbieren und mit dem zugehörigen Wert aus Spalte 4 multiplizieren. Das ganze soll wieder in der for-Schleife laufen und mit der if-Bedingung geprüft werden, ob der Wert in Spalte 3 gültig ist:
Code:
for k=1:size(A) if isfinite(A(k,3))
A(k,5)=(A(letzter_gültiger_Wert,1)+A(nächster_gültiger_Wert,1))/2*A(k,4) end end
Nun wird das aber für die Zeile 9 problematisch, da in Zeile 8,Spalte1 ein NaN steht. Deshalb würde ich gerne innerhalb der for- und if-Schleife erst prüfen, welcher der letzte und welcher nächste gültige Wert in Spalte 1 ist, bevor ich die Berechnung ausführe.
Geht das überhaupt?
Gruß
Senraphil
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.