Ist es möglich, die Nicht-Nan-Werte eines Vektors zu finden, aber auch eine Anzahl von Nans zuzulassen? Zum Beispiel, wenn ich folgende Daten habe:
%Vor%und ich möchte nur die längste Folge von Werten mit Nicht-Nans beibehalten, aber zulassen, dass 'n' Anzahl von Nans in den Daten beibehalten wird. Also, sagen, dass ich bereit bin, 1 Nan zu behalten, würde ich eine Ausgabe von
haben %Vor%Das ist, die beiden Nans am Anfang wurden entfernt, weil sie die obigen Werte in 'thres' überschreiten, aber das dritte nan ist für sich allein und kann daher in den Daten behalten werden. Ich würde gerne eine Methode entwickeln, bei der Thres als beliebiger Wert definiert werden kann.
Ich kann die Nicht-Nan-Werte mit
finden %Vor%Irgendwelche Ideen?
Um die längste Sequenz zu finden, die höchstens threshold
mal NaN
enthält, müssen wir den Anfang und das Ende der Sequenz (en) finden.
Um alle möglichen Startpunkte zu generieren, können wir hankel
verwenden:
Jetzt müssen wir das letzte gültige Element in jeder Zeile finden.
Um dies zu tun, können wir cumsum
verwenden:
Der Endpunkt für jede Zeile ist derjenige, in dem das entsprechende Element in C
höchstens threshold
:
Das letzte gültige Element wird gefunden mit:
%Vor%Wir müssen sicherstellen, dass die tatsächliche Länge jeder Zeile respektiert wird:
%Vor%Falls es mehrere Sequenzen gleicher Länge gibt, nehmen wir einfach die erste und zeigen sie an:
%Vor%vollständiges Skript
%Vor% Ein möglicher Ansatz besteht darin, Y = double(~isnan(X));
mit einem Fenster von n
Einsen zu falten, wobei n
um bis eine akzeptable Teilfolge gefunden wird. "Akzeptabel" bedeutet, dass die Untersequenz mindestens n-thres
Einsen enthält, dh die Faltung gibt mindestens n-thres
.
Das Konvertieren von Y
mit einem Fenster von n
eins (wie in Ansatz 1) entspricht dem Berechnen einer kumulativen Summe von Y
und dem anschließenden Verwenden von Differenzen mit n
spacing. Dies ist effizienter in Bezug auf die Anzahl der Operationen.
Dies berechnet im Wesentlichen alle Iterationen der Schleife in Ansatz 1.
%Vor%Lasst uns mein Lieblingswerkzeug ausprobieren: RLE. Matlab hat keine direkte Funktion, also benutze mein "seqle" gepostet für den zentralen Austausch. Die Standardeinstellung von Seqle ist die Rückgabe der Lauflängencodierung. Also:
%Vor% Der "Lauf" gibt die Länge des aktuellen Laufs an; "val" zeigt den Wert an. In diesem Fall gibt val==1
an, dass der Wert nan
ist und val==0
numerische Werte angibt. Sie können sehen, dass es relativ einfach ist, die längste Folge von "run" -Werten zu extrahieren, die die Bedingung val==0 | run < 2
erfüllen, um nicht mehr als ein nan
in einer Zeile zu erhalten. Nehmen Sie dann einfach die kumulativen Indizes dieses Laufs und das ist die Untermenge von foo
, die Sie wollen.
BEARBEITEN:
Leider ist es nicht so einfach, über den Code zu extrahieren, was mit dem Auge trivial ist. Ich vermute, es gibt einen viel schnelleren Weg, die durch longrun
identifizierten Indizes zu verwenden, um die gewünschte Teilsequenz zu erhalten.
Hmmm, wer mag keine Herausforderungen, meine Lösung ist nicht so gut wie die von ms.s., aber es ist eine Alternative.
%Vor%Aus irgendeinem Grund macht das Matlab-Invertieren "'" die Formatierung merkwürdig.
%Vor%8 10 11 NaN 9 14 6 1 4 23 24
Wann: X = [18 3 Nan Nan Nan 8 10 11 Nan Nan 9 14 6 1 Nan Nan Nan 4 23 24]; % // Eingabearray thresh = 2;
8 10 11 NaN 4 23 24
Tags und Links matlab