2015-04-13 3 views
2

У меня есть некоторые числовые данные положительной функции с рядом «нулей», однако ни один из этих нулей никогда не равен нулю. Я хотел бы извлечь позиции всех этих нулевых значений и задавался вопросом, что лучший способ сделать это. Вот надуманный пример, который похож на то, что я хотел бы решить, с иллюстративным участком значений, смежных различий, а также признаки этих различий:Как численно искать все самые близкие к нулю значения в массиве Matlab?

a = [ 0.0062 ; 0.0041 ; 0.0021 ; 0.0003 ; 0.0015 ; 0.0031 ; 0.0045 ; 0.0059 ; 0.0062 ; 0.0041 ; 0.0021 ; 0.0003 ; 0.0015 ; 0.0031 ; 0.0045 ; 0.0059 ]/0.0062 ; 
d = diff(a) ; 

r = -3/2:0.5:length(a)/2-4/2 ; 

close all ; 
hold on ; 

plot(r, a) ; 
plot(r(1:length(d)), d) ; 
plot(r(1:length(d)), sign(d)) ; 

Который производит:

zeros

Основываясь на том, что я сделал, я мог бы перебрать массив и найти все места, что изменение знака разницы массива от -1 до 1. Два вопроса:

  1. Есть ли лучший способ сделать это, чем для цикла?
  2. Есть ли лучший способ сделать этот поиск всех мини-залов?
+0

Итак, с вашим примером 'a', каков был бы желаемый результат? –

+1

Если у вас есть определенный допуск, вы можете попробовать использовать ['find'] (http://www.mathworks.com/help/matlab/ref/find.html). например 'idx = find (abs (a) <допуск)' – excaza

+0

Индексы массивов, которые содержат значения 0.003/0.0062. Соответствующие значения в числовом диапазоне r действительно являются тем, что я за ним, но я могу сделать это окончательное отображение. –

ответ

4

К значения находят, при котором разница изменяется с положительной на отрицательную:

indices = find(diff(sign(diff(a)))==2)+1; 

В вашем примере это дает

indices = 
    4 
    12 

В зависимости от того, что вы хотите достичь , вы можете найти самое близкое к нулю значение (и) directl у следующим образом:

b = abs(a); 
indices = find(b==min(b)) 

, который также дает

indices = 
    4 
    12 

Обратите внимание, что это будет найти индекс значения, ближе к нулю, если не является связь между несколькими значениями, в которых случай возвращает несколько индексов.

+0

Ваш первый метод работает хорошо. Второй не будет для моих данных, так как минимум не гарантирует, что он будет одинаковым при каждом «ноле». –

+0

@PeeterJoot Хорошая точка. Я отредактировал ответ, чтобы дать понять потенциальным читателям, что второй метод обычно возвращает только одно значение. –

0

Как насчет принять your_data, сделать 1./your_data, а затем использовать findpeaks. Дополнительную информацию см. В документации по дополнительным параметрам: findpeaks, в том числе возможность присвоить ценность для наименьшего пика. Это должно помочь.

+0

Я, похоже, не купил набор инструментов обработки сигналов. –

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