Comment puis-je obtenir tous les extrema locaux en Perl sans rouler mon propre?
Question
Il est pas trop difficile à mettre en œuvre, mais je préférerais la réutilisation du code si possible.
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}]}
Alors, savez-vous d'un module qui implémente quelque chose de semblable?
La solution
Cela peut juste être une lacune dans CPAN; il pourrait utiliser un module extrema local. Pensez à fourbir une et de les publier!
Code de maxima locaux (intentionnellement optimisé pour une clarté, pas d'efficacité):
Besoin d'aide avec détection de signal de crête en Perl
Notez qu'il ya des questions qui devraient survenir lorsque vous pensez à extrema: Si les critères d'évaluation inclus? Si un extremum se compose de plusieurs points de données consécutifs (égaux), voulez-vous l'indice de la première, la dernière, ou tout? Voulez-vous tous extrema ou tout simplement le haut k? Si plusieurs maxima ou minima se produire dans la proximité (dans les n de l'autre), voulez-vous tout ou une seule? Un bon module de rendrait les gens choisir exactement les réponses qu'ils veulent.
Autres conseils
Il n'y a pas de module CPAN Je suis au courant, mais une belle discussion de "top X extrema local" se trouve dans ce fil: http://www.perlmonks.org/?node_id=629742 - la tâche il y a un plus difficile "trouver K top maxima" au lieu de "tous les maxima locaux"
Je ne sais pas de tous les modules CPAN qui font cela. Cependant, pour un point de départ faire vérifier List::Util
(module de base) et List::MoreUtils
CPAN modules qui devraient vous aider à construire une solution.
Pour exemple:
use List::Util qw/min max/;
my $min = min @arr;
my $max = max @arr;
ou
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 /