Mittlere Berechnung aus akkumulierten Zeilenwerten, während NaN in MATLAB ignoriert wird

8

Ich suche Vorschläge zur Lösung des folgenden Problems elegant . Obwohl Leistung in meinem speziellen Fall kein Problem ist, würde ich mich über Kommentare zu bewährten Verfahren freuen.

Vielen Dank im Voraus!

Die kurze Version:

Ich versuche, Matrixzeilen nach einer gewissen Logik zu mitteln, während NaN-Werte ignoriert werden. Der Code, den ich derzeit habe, behandelt NaN-Werte nicht so, wie ich es möchte.

Die lange Version:

Meine Daten sind folgendermaßen aufgebaut:

  • Eine einzelne (erste) Spalte von "Bins". Die Anzahl der Zeilen pro Bin ist nicht konstant. Die Bins müssen nicht ganze Zahlen sein. Zeilen sind vorsortiert.
  • Eine variable Anzahl von Datenspalten, möglicherweise einschließlich NaNs.

Hier ist ein Beispiel:

%Vor%

Das gewünschte Ergebnis ist eine Matrix, die die eindeutigen "Bins" in der ersten Spalte enthält und im Rest "unberührte NaNs" bedeutet, z. B .:

  • Wenn für eine bestimmte Spalte + bin nur NaNs vorhanden sind (im obigen Beispiel: 1. Datenspalte + Bin 210) - wäre das Ergebnis NaN.
  • Wenn es für eine bestimmte Spalte + bin eine Mischung aus NaNs und Zahlen gibt, wäre das Ergebnis der Mittelwert der gültigen Zahlen. Im obigen Beispiel: 1. Datenspalte + Bin 200 sollte (0.720+0.706+0.693)/3=0.7063 geben - beachten Sie die Division durch 3 (und nicht 4) für diese Spalte + bin.

Hier ist das gewünschte Ergebnis für das obige Beispiel:

%Vor%

Was ich bisher versucht habe:

Dies ist ein Code, den ich aus verschiedenen Quellen kompilieren konnte. Es funktioniert gut für Spalte + bin, die nur NaNs oder Zahlen enthalten.

%Vor%

Folgendes bekomme ich gerade:

%Vor%

S.

  1. Wenn das mit einer Tabellenkalkulationssoftware (wie MS Excel) einfacher ist, würde ich gerne Ideen hören.
  2. Die Berechnung pro Spalte ist meine derzeitige Idee, wie ich damit umgehen soll. Ich habe mich nur gefragt, ob es einen Weg gibt, es zu verallgemeinern, um die komplette Matrix sofort zu übernehmen.
Dev-iL 13.07.2014, 15:25
quelle

2 Antworten

5

Ein möglicher Ansatz: Finden Sie Änderungen in der ersten Spalte (die Tatsache ausnutzend, dass es vorsortiert ist) und wenden Sie an nanmean für jeden Zeilenblock:

%Vor%

Sie können arrayfun durch eine explizite Schleife ersetzen. Das ist möglicherweise schneller und vermeidet den von Zellen eingeführten Overhead:

%Vor%

Ihr Ansatz kann auch verwendet werden. Sie müssen nur accumarray mit einem Handle für die Funktion nanmean aufrufen. Dies erfordert nicht, dass die erste Spalte vorsortiert wird.

%Vor%     
Luis Mendo 13.07.2014, 15:38
quelle
0

Hier ist eine andere Lösung, obwohl grob ineffizient. Das Ausgabe-Array wird auch alle NaN -Werte auf 0 setzen. Sagen wir einfach, das ist gut für akademische Studien. Hier sind die Schritte, die ich gemacht habe:

  1. Suchen Sie für jede ID, die Sie in der ersten Spalte haben, eine eindeutige Liste.
  2. Teilen Sie für die anderen Spalten jede Spalte in ein Zellenfeld auf.
  3. Erstellen Sie ein neues Zellen-Array, wobei für jede Spalte die erste Spalte für jedes Element in diesem Zellen-Array
  4. angehängt wird
  5. Filtern Sie diese Zeilen für jedes Zellen-Array, das einen NaN -Wert
  6. enthält
  7. Führen Sie für jede Spalte des gefilterten Ergebnisses accumarray mit mean als Funktionskennung aus.
  8. Unter Verwendung der IDs in Schritt # 1 indizieren Sie jedes accumarray -Ergebnis und transformieren Sie es zurück in eine Matrix
%Vor%

Das Ergebnis ist:

%Vor%

Wie Sie sehen können, ziemlich ineffizient - vor allem mit der Menge an cellfun Anrufe, die ich gemacht habe, aber immer noch ein akademisches Beispiel, denke ich!

    
rayryeng 13.07.2014 17:33
quelle

Tags und Links