Finde die längste Sequenz von Nicht-Nan-Werten, aber erlaube einen Schwellenwert

8

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?

    
Emma Tebbs 08.09.2015, 11:40
quelle

4 Antworten

8

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:

%Vor%

Jetzt müssen wir das letzte gültige Element in jeder Zeile finden. Um dies zu tun, können wir cumsum verwenden:

%Vor%

Der Endpunkt für jede Zeile ist derjenige, in dem das entsprechende Element in C höchstens threshold :

ist %Vor%

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%     
m.s. 08.09.2015, 12:42
quelle
5

Ansatz 1: Faltung

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 .

%Vor%

Ansatz 2: kumulative Summe

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.

%Vor%

Ansatz 3: 2D-Faltung

Dies berechnet im Wesentlichen alle Iterationen der Schleife in Ansatz 1.

%Vor%     
Luis Mendo 08.09.2015 13:53
quelle
1

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.

%Vor%     
Carl Witthoft 08.09.2015 15:41
quelle
0

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

  
    
GameOfThrows 08.09.2015 13:31
quelle

Tags und Links