2016-07-24 228 views
0

我有一個包含矩陣ECoG和嵌套結構TextMark的結構。MATLAB:使用find函數查找大矢量中特定值的行號

ECoG有2列和許多行(10798910x2雙)。第一列表示信號的值,第二列表示時間。

TextMark包含2個陣列:timestexttimes(26x1 double)包含與text(一個26x80字符數組)中表示的事件對應的時間值。

我正在寫一個腳本,它在text中找到特定字符串的索引,並從times中的相同索引中獲取時間值x

我希望它在ECoG的第二列找到x並返回值的索引。

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

當運行此,返回的值是

空矩陣:0×1

然而當我輸入的output.TextMark.times(x,:)

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

返回的值是ECoG中的正確索引。由於output.Textmark.times(x,:) = 1.0219e+03我不知道爲什麼第一個命令不起作用。

回答

0

我假設比較兩個double元素的問題結果。
下面的代碼行比較Double類的兩個要素:
output.ECoG(:,2) == output.TextMark.times(x,:)
問題描述有點混亂(多文本和幾個值),所以我很抱歉,如果我沒有理解錯的話...

使用==比較兩個雙元素,可能會在兩個元素打印時看起來相同時返回false,event。

例子:

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

當顯示a和b你在Matlab命令窗口得到:

a = 

    1.0000 

b = 

    1.0000 

但是,當你鍵入a == b,您可以:

ans = 

    0 

有很多情況下,當兩個相同的雙元素不相等時。
有關Matalb中雙浮點數的更多信息,請參閱http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html
您也可以閱讀https://en.wikipedia.org/wiki/Floating_point

用於比較兩個雙元素,你可以使用下面的例子:

ABS(測試值 - comparisonValue)< = EPS(comparisonValue)

我從這裏例如:https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=double%20precision%20matlab

另一種可能的解決方案(應用您的代碼示例):

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)