2016-07-24 34 views
0

Ich habe eine Struktur, die sowohl eine Matrix ECoG als auch eine verschachtelte Struktur TextMark enthält.MATLAB: Suche nach der Zeilennummer eines bestimmten Wertes in einem großen Vektor mit der Funktion find

ECoG hat 2 Spalten und viele Reihen (10798910x2 doppelt). Die erste Spalte repräsentiert die Werte eines Signals und die zweite Spalte repräsentiert die Zeit.

TextMark enthält 2 Arrays: times und text. times (26x1 double) enthält Zeitwerte, die Ereignissen entsprechen, die in text, einem 26x80-char-Array, dargestellt sind.

Ich schreibe ein Skript, das den Index einer bestimmten Zeichenfolge in text findet und den Zeitwert x aus dem gleichen Index in times nimmt.

Ich möchte es dann x in der zweiten Spalte von ECoG finden und den Index des Wertes zurückgeben.

x = strmatch('example',output.TextMark.text) 
[y] = find(output.ECoG(:,2) == output.TextMark.times(x,:)) 

Als ich dies ausführen, der zurückgegebene Wert

leere Matrix: 0-by-1

jedoch, wenn ich geben Sie den bekannten Wert von output.TextMark.times(x,:)

x = strmatch('example',output.TextMark.text) 
[y] = find(output.ECoG(:,2) == 1.0219e+03) 

Der zurückgegebene Wert ist der korrekte Index in ECoG.

Angesichts der output.Textmark.times(x,:) = 1.0219e+03 Ich weiß nicht, warum der erste Befehl nicht funktioniert.

Antwort

0

Ich nehme an, das Problem ergibt sich aus dem Vergleich zweier double Elemente.
Die folgende Codezeile vergleicht zwei Elemente der Klasse double:
output.ECoG(:,2) == output.TextMark.times(x,:)
Die Problembeschreibung ist etwas verwirrend (viel Text, und nur wenige Werte), ich bin so entschuldige mich, wenn ich Sie nicht richtig verstanden ...

Vergleicht man zwei Doppelelemente mit ==, kann false zurückgegeben werden, wenn die beiden Elemente beim Drucken identisch aussehen.

Beispiel:

a = 1 + 1e-10; 
b = 1 + 1e-11; 

Wenn Sie eine Anzeige und b Sie in Matlab Befehl Fenster erhalten:

a = 

    1.0000 

b = 

    1.0000 

Aber wenn man a == b eingeben, bekommen Sie:

ans = 

    0 

Es Es gibt viele Fälle, in denen zwei doppelte Elemente, die gleich sein sollen, nicht gleich sind.
Hier finden Sie http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html für weitere Informationen über doppelte Gleitkommazahlen in Matalb.
Sie können auch https://en.wikipedia.org/wiki/Floating_point lesen.

Für zwei Doppelelemente Vergleich können Sie das folgende Beispiel verwenden:

abs (Testvalue - comparisonValue) < = eps (comparisonValue)

ich von hier aus Beispiel nahm: https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=double%20precision%20matlab

Eine andere mögliche Lösung (gilt Ihr Codebeispiel):

my_eps = 1e-6; %Set my_eps to small value that difference of two time elements are considered equal. 
[y] = find(abs(output.ECoG(:,2) - output.TextMark.times(x,:)) < my_eps)