3

实现起来并不难,但如果可能的话,我更喜欢代码重用。

my @arr = (2,3,4,5,5,5,4,4,3,1,1,2,3,0,2,4);
my $ret = {MAXIMA=>[{INDEX=>3, VAL=>5},{INDEX=>4, VAL=>5},{INDEX=>5, VAL=>5}],
           MINIMA=>[{INDEX=>9, VAL=>1},{INDEX=>10, VAL=>1},{INDEX=>13, VAL=>0}]}

那么,您知道任何实现类似功能的模块吗?

4

3 回答 3

3

这可能只是 CPAN 中的一个缺口;它可以使用局部极值模块。考虑完善一个并发布它!

局部最大值代码(故意优化可理解性,而不是效率):

在 Perl 中需要峰值信号检测方面的帮助

请注意,当您考虑局部极值时应该会出现一些问题:是否应该包括端点?如果一个极值由几个连续(相等)的数据点组成,你想要第一个、最后一个还是全部的索引?你想要所有极值还是只想要前k?如果多个最大值或最小值出现在非常接近的位置(彼此在 n 内),你想要全部还是只想要一个?一个好的模块会让人们准确地选择他们想要的答案。

于 2010-10-10T17:35:12.940 回答
1

我知道没有 CPAN 模块,但可以在此线程中找到关于“top X local extrema”的精彩讨论:http ://www.perlmonks.org/?node_id=629742 - 那里的任务更加困难“找到 K 顶部最大值”而不是“所有局部最大值”

于 2010-10-10T16:21:10.620 回答
1

我不知道有任何 CPAN 模块可以做到这一点。但是,作为起点,请检查List::Util(核心模块)和List::MoreUtilsCPAN 模块,它们应该可以帮助您构建解决方案。

例如:

use List::Util qw/min max/;
my $min = min @arr;
my $max = max @arr;

或者

use List::MoreUtils ':all';
my ($min, $max) = minmax @arr;

# and then... 
my @maxima_indexes = indexes { $_ == $max } @arr;

# global maxima...
my @maxima = map { {INDEX => $_, VAL => $max} } @maxima_indexes;

/I3az/

于 2010-10-10T16:30:13.437 回答