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

Letzten/nächsten gültigen Wert verwenden

 

Senraphil
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2014, 12:35     Titel: Letzten/nächsten gültigen Wert verwenden
  Antworten mit Zitat      
Hallo zusammen,

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:

Code:

A=
5,11   0,511   NaN   87
NaN   NaN   10000   199
25   2,5   NaN   194
NaN   NaN   10000   407
-15,7   -1,57   NaN   20
-14   -1,4   NaN   682
NaN   NaN   NaN   NaN
NaN   NaN   16000   480
16   1,6   NaN   518
NaN   NaN   16000   496
NaN    Nan   NaN   NaN
-15   -1,5   NaN   133
NaN   NaN   27000   867
17,13   1,713   NaN   1529
NaN   NaN   NaN   NaN
NaN   NaN   25000   828
-16   -1,6   NaN   1047
NaN   NaN   NaN   NaN
NaN   NaN   NaN   NaN
NaN   NaN   22000   286
-3   -0,3   NaN   133
NaN   NaN   25000   225
6   0,6   NaN   275
NaN   NaN   25000   275
17   1,7   NaN   340
 


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
if isnan(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.

Gruß
Senraphil
Private Nachricht senden Benutzer-Profile anzeigen


Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2014, 08:07     Titel:
  Antworten mit Zitat      
Hat niemand eine Idee?

Mir würde schon helfen, wenn ich weiß, wie ich innerhalb einer Schleife gie Werte einer bestimmten Spalte abfragen kann.

Gruß
Senraphil
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 30.07.2014, 09:36     Titel:
  Antworten mit Zitat      
Hallo,

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));
    if any(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

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2014, 10:21     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
A=
0      NaN      NaN      412
5.11   0.51   NaN   87
NaN   NaN   10000   199
25   2.50   NaN   194
NaN   NaN   10000   407
-15.7   -1.57   NaN   20
-14   -1.40   NaN   682
NaN   NaN   NaN   NaN
NaN   NaN   16000   480
16   1.60   NaN   518
NaN   NaN   16000   496
NaN   NaN   NaN   NaN
-15   -1.50   NaN   133
 

Nun soll Spalte 5 durch folgende Berechnungen gefüllt werden:
Code:

for k=1:size(A)
if isfinite(A(k,1))
A(k,5)=(A(k,1)/1000)*A(k,4)
else
A(k,5)=NaN
end
end


Als Zwischenergebnis sieht die Matrix dann wie folgt aus:
Code:
A=
0   NaN   NaN   412   0
5.11   0.51   NaN   87   0.44457
NaN   NaN   10000   199   NaN
25   2.50   NaN   194   4.85
NaN   NaN   10000   407   NaN
-15.7   -1.57   NaN   20   -0.314
-14   -1.40   NaN   682   -9.548
NaN   NaN   NaN   NaN   NaN
NaN   NaN   16000   480   NaN
16   1.60   NaN   518   8.288
NaN   NaN   16000   496   NaN
NaN   NaN   NaN   NaN   NaN
-15   -1.50   NaN   133   -1.995


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


Für Zeile 3 ist das noch relativ eínfach, da ich folgendes eingeben kann:
Code:

for k=1:size(A)
if isfinite(A(k,3))
A(k,5)=(A(k-1,1)+A(k+1,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
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.