在 MATLAB 中使用逻辑索引查找局部最大值
Find local maxima with logical indexing in MATLAB
我之前在 MATLAB 向量中使用逻辑索引来处理
X = X(X < 6);
但是现在我想使用相同的想法找到局部极值,但条件是 "local"。我会对
这样的东西感兴趣
X = X(X(i) > X(i-1) & X(i) > X(i + 1));
我知道这在向量的第一个和最后一个元素中不起作用,并且有更好的方法来找到局部极值。
这个问题与上一个问题 (Getting FFT peaks from data) 的不同之处在于我对寻找最大值并不特别感兴趣,而是能够使用具有 "local" 条件的逻辑索引来引用到向量中的相邻元素。
您不能像您描述的那样直接执行此操作。您将不得不创建额外的数据,这些数据本身可能会进行逻辑测试,其输出可能会用于索引您的向量。在您的情况下,最好的方法是计算近似导数,并找到该导数的向下过零点。
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');
此代码生成下图,其中局部最大值是蓝色星星,局部最小值是绿色圆圈。
我之前在 MATLAB 向量中使用逻辑索引来处理
X = X(X < 6);
但是现在我想使用相同的想法找到局部极值,但条件是 "local"。我会对
这样的东西感兴趣X = X(X(i) > X(i-1) & X(i) > X(i + 1));
我知道这在向量的第一个和最后一个元素中不起作用,并且有更好的方法来找到局部极值。
这个问题与上一个问题 (Getting FFT peaks from data) 的不同之处在于我对寻找最大值并不特别感兴趣,而是能够使用具有 "local" 条件的逻辑索引来引用到向量中的相邻元素。
您不能像您描述的那样直接执行此操作。您将不得不创建额外的数据,这些数据本身可能会进行逻辑测试,其输出可能会用于索引您的向量。在您的情况下,最好的方法是计算近似导数,并找到该导数的向下过零点。
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');
此代码生成下图,其中局部最大值是蓝色星星,局部最小值是绿色圆圈。