实现起来并不困难,但如果可能,我更喜欢代码重用。
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}]}
那么,你知道任何实现类似功能的模块吗?
答案 0 :(得分:3)
这可能只是CPAN的一个缺口;它可以使用本地极值模块。考虑抛光并发布它!
本地最大代码(故意针对可理解性而非效率进行优化):
Need help with peak signal detection in Perl
请注意,当您考虑局部极值时,应该会出现一些问题: 应该包括端点吗?如果极值由几个连续(相等)的数据点组成,您是否想要第一个,最后一个或全部的索引?你想要所有的极端吗? 还是只是顶尖的k?如果多个最大值或最小值发生在附近(彼此的n内),你想要全部还是只有一个?一个好的模块会让人们选择他们想要的答案。
答案 1 :(得分:1)
我没有注意到CPAN模块,但是在这个帖子中可以找到关于“顶部X局部极值”的很好的讨论:http://www.perlmonks.org/?node_id=629742 - 这个任务有一个更困难的“找到K top maxima”而不是“所有局部最大值”
答案 2 :(得分:1)
我不知道有任何CPAN模块可以做到这一点。但是,对于起点,请查看List::Util
(核心模块)和List::MoreUtils
CPAN模块,它们可以帮助您构建解决方案。
例如:
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 /