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!
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.
Meine Daten sind folgendermaßen aufgebaut:
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 .:
(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%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% 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:
Sie können arrayfun
durch eine explizite Schleife ersetzen. Das ist möglicherweise schneller und vermeidet den von Zellen eingeführten Overhead:
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.
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:
NaN
-Wert accumarray
mit mean
als Funktionskennung aus. accumarray
-Ergebnis und transformieren Sie es zurück in eine Matrix 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!
Tags und Links matlab nan accumarray