accumarray

___ tag123matlab ___ MATLAB ist eine von MathWorks entwickelte Hochsprachen- und interaktive Programmierumgebung für numerische Berechnungen und Visualisierung. Fragen sollten entweder mit [tag: matlab] oder [tag: oktave] versehen werden, aber nicht mit beiden, es sei denn, die Frage bezieht sich explizit auf beide Pakete. Wenn Sie dieses Tag verwenden, erwähnen Sie bitte die MATLAB-Version, mit der Sie arbeiten (z. B. R2017a). ___ tag123nan ___ NaN ist eine Abkürzung für "Not a Number". NaN ist manchmal nicht gleich selbst. ___ qstntxt ___

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 %code% 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.
___ qstnhdr ___ Mittlere Berechnung aus akkumulierten Zeilenwerten, während NaN in MATLAB ignoriert wird ___ answer24725392 ___

Hier ist eine andere Lösung, obwohl grob ineffizient. Das Ausgabe-Array wird auch alle %code% -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 %code% -Wert
  6. enthält
  7. Führen Sie für jede Spalte des gefilterten Ergebnisses %code% mit %code% als Funktionskennung aus.
  8. Unter Verwendung der IDs in Schritt # 1 indizieren Sie jedes %code% -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 %code% Anrufe, die ich gemacht habe, aber immer noch ein akademisches Beispiel, denke ich!

    
___ answer24724370 ___

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

%Vor%

Sie können %code% 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 %code% mit einem Handle für die Funktion %code% aufrufen. Dies erfordert nicht, dass die erste Spalte vorsortiert wird.

%Vor%     
___ tag123acumarray ___ accumarray ist eine MATLAB-Funktion, mit der Elemente in einem Vektor oder einer Matrix basierend auf einem anderen Vektor oder einer Matrix von Indizes akkumuliert werden. accumarray wird üblicherweise zum Berechnen von Histogrammen, zum Gruppieren von Werten auf der Grundlage bestimmter Kriterien oder zum Anwenden bestimmter Funktionen auf gruppierte Daten verwendet, sobald sie mit dem Akkumulator gruppiert sind. Es ist derzeit eine der vielseitigsten Funktionen in MATLABs nativer Bibliothek und war seit MATLAB 7, R14 verfügbar. ___
2
Antworten

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

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 ve...
13.07.2014, 15:25