2016-09-20 5 views
2

Ich habe verschiedene Matrices suchen so etwas wie dies matrixExample = [NaN, NaN, 50, 50, 50, 70, 70, 40, 40, 90, 90, 20, 20, 20]finden Indizes eine Zahlenfolge

Ist es möglich, in dieser Matrix, die die Indizes einer Zahlenfolge zu bekommen? Ich weiß, dass die Matrix 70, 70, 40, 40, 90, 90 enthält, was eine Sequenz ist. Jetzt möchte ich es so einstellen, wenn die Matrix eine Folge von 70, 40, 90 enthält (etwas, das ich selbst gesetzt habe) Ich möchte die Indizes erhalten, wo diese Sequenz beginnt (70) und endet (90). Die Zahlen müssen in der festgelegten Reihenfolge der Zahlen kommen, aber die Anzahl der Zahlen kann abweichen, 70, 40, 40, 40, 40, 40, 90, 90, 90 würde auch zählen (und so weiter).

Ein letztes Beispiel: matrixExample = [NaN, NaN, 50, 70, 50, 80, 70, 60, 70, 70, 40, 40, 90, 90, 20, 20, 20]

finden, wo die Sequenz 70, 40, 90 ist und Start- und Zielindizes geben, wo 70 der Anfang und 90 ist das Ende.

Hilfe wird sehr geschätzt !!

+0

ich anfangen würde durch Schreiben eine Funktion, die mithilfe einer Schleife überprüft, ob ein Vektor, der bei "ii" beginnt, mit Ihrer Sequenz übereinstimmt, ohne dass die Zahlen mehrfach übereinstimmen. Sobald Sie dies haben, würde ich es erweitern, um auch mehrere Übereinstimmungen zu ermöglichen. Schließlich würde ich fragen: "Was soll ich tun, wenn es mehr als eine Match-Sequenz gibt, zum Beispiel die längste Übereinstimmung oder die erste Übereinstimmung?" – Steve

+0

Es wird nicht mehr als eine Match-Sequenz geben, daher muss ich "nur" herausfinden, wo das Sequenz-Start-Ende endet. –

+0

Okay, nur die ersten zwei Punkte. Zu Beginn wäre etwas wie eine kleine Funktion "matchAt (ii, v, A)", die durch "A" beginnt, beginnend bei "A (ii)", eine ziemlich einfache Schleife. – Steve

Antwort

4

Hier ist ein vektorisiert Ansatz -

search_seq = [70,40,90]; 
idx = [1 find(diff(matrixExample)~=0)+1 numel(matrixExample)+1]; 
idx0 = strfind(matrixExample(idx(1:end-1)),search_seq) 
start_idx = idx(idx0) 
idx1 = idx0+numel(search_seq); 
stop_idx = idx(idx1)-1 

Probe läuft

Fall # 1:

>> matrixExample = [NaN, NaN, 50, 50, 50, 70, 70, 40, 40, 90, 90, 20, 20, 20]; 
start_idx = 
    6 
stop_idx = 
    11 

Fall # 2:

>> matrixExample = [NaN, NaN, 50, 70, 50, 80, 70, 60, ... 
    70, 70, 40, 40, 90, 90, 20, 20, 20]; 
start_idx = 
    9 
stop_idx = 
    14 
+0

Vielen Dank, das funktioniert super bis auf eine Sache. Wenn ich es auf einer sehr langen Liste teste, ist start_idx der vorletzte Wert in dieser Reihenfolge. –

+1

@ J.Smith Sollte in den gerade editierten Codes behoben werden. – Divakar

+0

Ein anderer Test: matrixExample = [NaN, NaN, 50, 55, 90, 70, 90, 70, 90, 70, 90, 70, 33, 33, 90] ergibt Start: 4 und Ende 12. –

Verwandte Themen