Voici un petit bout de code pour extraire les min/max locaux d'une série de valeur. C'est un problème récurent dans l'analyse des histogrammes.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 /** * Local Extrema extraction * * @author by X.Philippeau * @param values the array of values * @return an array of local heights */ public static int[] localHeight(int[] values) { int[] height = new int[values.length]; // pass 1: left to right int up=0,down=0; for(int i=1;i<=values.length-2;i++) { int delta = values[i]-values[i-1]; if (delta>0) {down=0;up+=delta;} if (delta<0) {up=0;down+=delta;} height[i]=(up>-down)?up:down; } // pass 2: right to left up=0;down=0; for(int i=values.length-2;i>=0;i--) { int delta = values[i]-values[i+1]; if (delta>0) {down=0;up+=delta;} if (delta<0) {up=0;down+=delta;} if (up<height[i]) height[i]=up; if (down>height[i]) height[i]=down; } return height; }
Cette méthode prend en paramètre le tableau d'entier des valeurs à analyser. Elle retourne un tableau d'entier de la meme taille que celui passé en parametre. Ce nouveau tableau contient l'altitude locale du pic (min/max).
altitude>0 -> le pic est un maximum
altitude<0 -> le pic est un minimum
altitude=0 -> il n'y a pas de pic a cet emplacement
Exemple:
La 14éme valeur du tableau (=138) est un maxima local d'altitude 15.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Valeurs: 128 129 127 125 127 131 129 125 123 124 126 133 137 138 137 132 124 119 116 117 120 127 138 144 148 149 145 140 131 120 112 106 103 103 107 112 121 133 141 148 154 159 161 160 158 151 142 127 115 104 Retour: 0 01 0 -04 0 06 0 0 -08 0 0 0 0 15 0 0 0 0 -22 0 0 0 0 0 0 33 0 0 0 0 0 0 -46 -46 0 0 0 0 0 0 0 0 57 0 0 0 0 0 0 0
Partager