在数组中查找多个最大值

时间:2013-01-31 01:35:46

标签: matlab max

我想使用Matlab从数组中找到多个最大值。

这是我的代码,只返回一个max及其位置:

[peak, pos] = max(abs(coeffs));

问题是我想在数组中检测到多个最大值。事实上,我需要在以下数组中检测前两个峰及其位置:

>> abs(coeffs())

ans =

    0.5442
    0.5465
    0.5545
    0.5674
    0.5862
    0.6115
    0.6438
    0.6836
    0.7333
    0.7941
    0.8689
    0.9608
    1.0751
    1.2188
    1.4027
    1.6441
    1.9701
    2.4299
    3.1178
    4.2428
    6.3792
   11.8611
   53.7537
   24.9119
   10.8982
    7.3470
    5.7768
    4.9340
    4.4489
    4.1772
    4.0564
    4.0622
    4.1949
    4.4801
    4.9825
    5.8496
    7.4614
   11.1087
   25.6071
   53.2831
   12.0029
    6.4743
    4.3096
    3.1648
    2.4631
    1.9918
    1.6558
    1.4054
    1.2129
    1.0608
    0.9379
    0.8371
    0.7532
    0.6827
    0.6224
    0.5702
    0.5255
    0.4861
    0.4517
    0.4212
    0.3941
    0.3698
    0.3481
    0.3282
    0.3105
    0.2946
    0.2796
    0.2665
    0.2541
    0.2429
    0.2326
    0.2230
    0.2141
    0.2057
    0.1986
    0.1914
    0.1848
    0.1787
    0.1729
    0.1677
    0.1627
    0.1579
    0.1537
    0.1494
    0.1456
    0.1420
    0.1385
    0.1353
    0.1323
    0.1293
    0.1267
    0.1239
    0.1216
    0.1192
    0.1172
    0.1151
    0.1132
    0.1113
    0.1096
    0.1080
    0.1064
    0.1048
    0.1038
    0.1024
    0.1011
    0.1000
    0.0987
    0.0978
    0.0967
    0.0961
    0.0951
    0.0943
    0.0936
    0.0930
    0.0924
    0.0917
    0.0913
    0.0908
    0.0902
    0.0899
    0.0894
    0.0892
    0.0889
    0.0888
    0.0885
    0.0883
    0.0882
    0.0883
    0.0882
    0.0883
    0.0882
    0.0883
    0.0885
    0.0888
    0.0889
    0.0892
    0.0894
    0.0899
    0.0902
    0.0908
    0.0913
    0.0917
    0.0924
    0.0930
    0.0936
    0.0943
    0.0951
    0.0961
    0.0967
    0.0978
    0.0987
    0.1000
    0.1011
    0.1024
    0.1038
    0.1048
    0.1064
    0.1080
    0.1096
    0.1113
    0.1132
    0.1151
    0.1172
    0.1192
    0.1216
    0.1239
    0.1267
    0.1293
    0.1323
    0.1353
    0.1385
    0.1420
    0.1456
    0.1494
    0.1537
    0.1579
    0.1627
    0.1677
    0.1729
    0.1787
    0.1848
    0.1914
    0.1986
    0.2057
    0.2141
    0.2230
    0.2326
    0.2429
    0.2541
    0.2665
    0.2796
    0.2946
    0.3105
    0.3282
    0.3481
    0.3698
    0.3941
    0.4212
    0.4517
    0.4861
    0.5255
    0.5702
    0.6224
    0.6827
    0.7532
    0.8371
    0.9379
    1.0608
    1.2129
    1.4054
    1.6558
    1.9918
    2.4631
    3.1648
    4.3096
    6.4743
   12.0029
   53.2831
   25.6071
   11.1087
    7.4614
    5.8496
    4.9825
    4.4801
    4.1949
    4.0622
    4.0564
    4.1772
    4.4489
    4.9340
    5.7768
    7.3470
   10.8982
   24.9119
   53.7537
   11.8611
    6.3792
    4.2428
    3.1178
    2.4299
    1.9701
    1.6441
    1.4027
    1.2188
    1.0751
    0.9608
    0.8689
    0.7941
    0.7333
    0.6836
    0.6438
    0.6115
    0.5862
    0.5674
    0.5545
    0.5465

我只需要两个第一个最大值的原因是最后两个是快速傅立叶变换后两个第一个值的反射。

1 个答案:

答案 0 :(得分:3)

您可以使用许多高峰查找工具来做到这一点。其中一些是:

Findpeaks

函数[pks,locs] = findpeaks(data)在位置pks的输入数据中返回局部最大值或峰值locs(从找到的第一个到最后一个排序)。数据需要行或列向量,其中实值元素的最小长度为3。 findpeaks将每个数据元素与其相邻值进行比较。如果数据元素大于其两个邻居或等于Inf,则该元素是本地峰值。如果没有局部最大值,则pks是空向量。

例如:

[pks,locs] = findpeaks(abs(coeffs))
plot(abs(coeffs)); hold on
plot(locs(1:2),pks(1:2),'ro'); 

enter image description here

1D Non-derivative Peak Finder - 一种FEX工具,可以在不使用一阶或二阶导数的情况下找到峰值,而是使用给定数据集中的局部斜率特征。

PeakFinder - 来自FEX的另一个峰值发现者,nate yoder。

并且在FEX中还有更多这些......