2016-07-24 2 views
0

У меня есть структура, содержащая как матрицу ECoG, так и вложенную структуру TextMark.MATLAB: поиск номера строки определенного значения в большом векторе с использованием функции поиска

ECoG имеет 2 колонки и много рядов (10798910x2 double). Первый столбец представляет значения сигнала, а второй столбец представляет время.

TextMark содержит 2 единицы: times и text. times (26x1 double) содержит значения времени, соответствующие событиям, представленным в text, массиве символов 26x80.

Я пишу скрипт, который находит индекс определенной строки в text и принимает значение времени x с тем же индексом в times.

Я хочу, чтобы он нашел x во втором столбце ECoG и вернул индекс значения.

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.
Следующая строка коды сравнивает два элемента класса двойного:
output.ECoG(:,2) == output.TextMark.times(x,:)
Описание проблемы немного запутанный (много текста, и несколько значений), поэтому я прошу прощения, если я вас не правильно понял ...

Сравнение двух двойных элементов с использованием ==, может возвращать false, событие, когда два элемента выглядят одинаково при их печати.

Пример:

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

При отображении а и б вы в командных окнах Matlab получить:

a = 

    1.0000 

b = 

    1.0000 

Но когда вы набираете a == b, вы получите:

ans = 

    0 

Там много случаев, когда два двойных элемента, которые должны быть равны, не равны.
См. Здесь http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html для получения дополнительной информации о двойных номерах с плавающей запятой в Matalb.
Вы также можете прочитать https://en.wikipedia.org/wiki/Floating_point.

Для сравнения двух двойных элементов можно использовать следующий пример:

абс (TestValue - 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) 
Смежные вопросы