【问题标题】:Finding more than one maximum in an array在数组中查找多个最大值
【发布时间】:2013-01-31 14:27:28
【问题描述】:

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

这是我的代码,它只返回一个最大值及其位置:

[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

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

【问题讨论】:

  • 将第一个峰值设置为零然后再次找到最大值有什么问题?

标签: matlab max


【解决方案1】:

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

Findpeaks

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

例如:

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

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

PeakFinder - 由 nate yoder 创作的另一个来自 FEX 的峰值探测器。

FEX 中还有很多这样的...

【讨论】:

  • 正是我想要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2013-06-24
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2018-05-03
  • 2020-08-20
相关资源
最近更新 更多