2013-12-06 2 views
1

Следующий код встраивается в функцииНайти заявление в MATLAB и несколько условий

rsp = find(response_times >= current1 & response_times < current2 & response_times ~= current2); 

Здесь я ищу для индексов ответов, которые происходят между current1 и current2, где current1 и current2 времена, такие как 16.22 и 16.32 соответственно, а время отклика может быть равно current1, но не current2.

По большей части это работает, как и предполагалось, однако, каждый раз он вытягивает индекс значения, равного current2.

Кто-нибудь знает, почему это может быть так, или как я могу улучшить эту строку кода, чтобы исправить ее.

Вот пример массива этот код работает на:

response_times = [ 8.73000000000000 
    11.4300000000000 13.4800000000000  
    14.7900000000000 16.3200000000000  
    18.0400000000000 20.3800000000000  
    20.9900000000000 21.3400000000000  
    24.2800000000000 24.6800000000000 ]; 

ответ

0

Это на самом деле не (точно) равна current2. Обычно вам не следует сравнивать числа с плавающей запятой для равенства. Читайте this article для получения дополнительной информации, но суть проблемы в том, что большинство значений не могут быть представлены точно с представлением с плавающей запятой (т. Е. IEEE 754), поэтому нецелесообразно проверять на равенство. Неравенства в порядке. На самом деле есть аккуратный mini-site, посвященный основному объяснению проблемы.

Для переполнения стека версия объяснения см. Это Q & A, озаглавленный "Why is 24.0000 not equal to 24.0000 in MATLAB?". Это довольно интересно читать!

Чтобы убедиться, что ваше неравенство действительно работает, попросите его вычислить abs(response_times-current2), и вы должны обнаружить, что в этих случаях значение не равно нулю, а нечто вроде 1.35e-15. Если вы хотите отклонить эти «слишком близкие» значения, включите тест, например (current2-response_times)>tol, и установите tol на что-то достаточно большое, чтобы отклонить эти очки.

+0

Я вижу. Я читал об этом; однако это не меняет того факта, что мне нужна эта функция для работы по назначению. Есть ли способ сказать Matlab для работы с десятичными данными? – cwdaniels

+0

@cwdaniels Ну, он работает, и нет никакого способа изменить его, если вы не округлите до целых чисел. С десятичными данными вам нужно установить порог. При сравнении двух поплавков для равенства обычно используется нечто вроде 'abs (f1-f2) tol' и установить' tol' достаточно низко, чтобы отклонить эти слишком близкие точки. – chappjc

+0

Я преобразовал все мои значения в целые числа, которые фиксировали часть моей проблемы. Я понял, что существенная потеря данных, которые я испытывал, на самом деле была вызвана заявлением о состоянии на ранней стадии функции, которая задавала вопрос о том, было ли какое-то значение меньше или больше 25 ... оно выкидывает испытания, в которых это произошло. – cwdaniels

Смежные вопросы