2015-03-11 4 views
1

Я использовал логическую индексацию, прежде чем в векторах MATLAB для условий какНайти локальные максимумы с логической индексацией в MATLAB

X = X(X < 6); 

Теперь, однако я хотел бы найти локальные экстремумы, используя ту же идею, но с «местными» условиях , Я бы быть заинтересованы в чем-то вроде

X = X(X(i) > X(i-1) & X(i) > X(i + 1)); 

Я знаю, что это не будет работать в первый и последний элементы вектора и что существуют более эффективные способы, чтобы найти локальные экстремумы.

Этот вопрос отличается от предыдущего (Getting FFT peaks from data) тем, что я не особо заинтересован в поиске максимумов, а скорее для того, чтобы использовать логическую индексацию с «локальными» условиями, относящимися к смежным элементам в векторе.

+0

Покажите нам минимальные данные ввода образца и ожидаемый результат? – Divakar

+0

Я не думаю, что это возможно только с логической индексацией без какого-либо цикла. – Navan

+0

Для относительных простых ограничений или условий вы можете использовать 'ordfilt2' или' findpeaks'. См. [Этот вопрос SO] (http://stackoverflow.com/questions/15548441/find-local-maximum-value-in-the-vector). – Maurits

ответ

5

Вы не можете сделать это напрямую, как описано. Вам придется создавать дополнительные данные, которые могут быть протестированы логически, выход которых может быть использован для индексации в ваш вектор. В вашем случае лучшим методом было бы вычисление примерной производной и поиск нулевых пересечений этой производной.

x = rand(1,50); 
xDiff = diff(x); 
xZeroCross = diff(sign(xDiff)); 
indexUp = find(xZeroCross>0)+1; 
indexDown = find(xZeroCross<0)+1; 
figure(); 
plot(1:50,x,'r',indexDown,x(indexDown),'b*',indexUp,x(indexUp),'go'); 

Этого код генерирует следующий график, где локальные максимумы голубые звезды и локальные минимумы зелеными круги. enter image description here