0
votes

Trouver les pics d'un tableau à l'aide de JavaScript

J'ai un tableau de 640 valeurs contenant les valeurs de Y de ce qui est nécessaire pour dessiner une ligne.

ligne p>

J'ai besoin de déterminer les positions de la matrice Parmi les sommets de chaque trois pics. P>

J'ai regardé des questions similaires sur les minimes de la MAXIMA / local local, mais en cours d'exécution, le code que j'ai trouvé ramasse les petits sommets. J'ai seulement besoin des trois pics très distincts. P>

J'essaie de le faire en JavaScript. Les données de la matrice sont les suivantes: P>

pos: [24, 316, 616]


10 commentaires

"J'essaie de le faire en JavaScript." Qu'avez-vous essayé exactement?


Qu'entendez-vous par 3 pics distincts? Comme en si 126 était le sommet plus tôt, ne le considèrent pas?


Vous pouvez exécuter une fenêtre sur les valeurs, calculer la somme des différences entre les valeurs de la fenêtre et voir où il y a plus de changement qu'un seuil donné. Ce seraient les pics des données comme la vôtre.


J'ai essayé ceci: Stackoverflow.com/a/42565092/1674937 sortira les éléments suivants: Peaks: (9) [ 362, 356, 356, 357, 358, 358, 367, 374, 377] POS: (9) [21, 67, 69, 112, 179, 181, 313, 608, 612]


S'il vous plaît ajouter le résultat aussi.


Alors, quels trois chiffres vous attendriez-vous à récupérer ici pour votre exemple spécifique? "J'ai seulement besoin des trois pics très distincts" - bien alors commencez à penser à la façon dont "très distincts" pourrait être exprimé mathématiquement , car c'est juste une prose très vague.


J'ai modifié la question pour montrer ce que j'ai essayé, les résultats et mon résultat attendu


Pouvez-vous expliquer vos données plus à fond? Je ne sais pas où vous avez vos chiffres de pointe. Votre tableau contient 24 valeurs uniques comprises entre 103 et 126?


Par pics, je veux dire les sommets des trois bosses de l'image. Je l'ai vu appelé Maxima local, mais je ne suis pas sûr que c'est ce qui devrait être appelé


Pouvez-vous définir un seuil pour un pic notable?


3 Réponses :


2
votes

Pour développer mon commentaire, quelque chose comme xxx

est raisonnablement bien de trouver les "pics" (ou plutôt des zones où il y a plus de changements de valeurs qu'ailleurs).

Vous pouvez trouver un exemple interactif sur https://codepen.io/akx/pen/qoweqq où vous pouvez également modifier la largeur de la fenêtre et les valeurs de seuil.


1 commentaires

Cela fonctionne parfaitement, merci. De cela, je devrais pouvoir modifier la sortie afin qu'elle affiche la valeur centrale de chaque instance.



0
votes

Vous pouvez rechercher des valeurs plus petites, par rapport à la valeur précédente et en mettant à jour l'indice de la dernière plus petite valeur et si les valeurs augmentent, puis poussez les nouveaux minima.

En réalité, cette approche retourne un minimum d'index 608 Où est ne devrait pas non, selon la question. Peut-être avez-vous besoin de filtrer trop de petits deltas de minima. P>

p>

var data = [126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 124, 123, 122, 122, 120, 119, 119, 118, 118, 118, 119, 119, 119, 120, 121, 121, 122, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 124, 125, 124, 125, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 123, 124, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 123, 122, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 119, 119, 119, 119, 116, 115, 114, 113, 113, 113, 113, 113, 115, 117, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 108, 107, 106, 118, 108, 108, 103, 103, 103, 103, 103, 103, 104, 105, 107, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
    push = true,
    last = 0,
    result = data.reduce((r, v, i, a) => {
        if (a[r[last]] === v) {                  // take latest index of series
            r[last] = i;
            return r;
        }
        if (a[i - 1] < v) {                      // look for new series
            push = true;
            return r;
        }
        if (a[i - 1] > v) {
            if (push && a[i - 1] > a[r[last]]) { // prevent continuing minima
                last = r.push(i) - 1;
                push = false;
            } else {
                r[last] = i;
            }
        }
        return r;
    }, []);


console.log('values ', result.map(i => data[i].toString().padStart(3)).join(' '));
console.log('indices', result.map(v => v.toString().padStart(3)).join(' '));


0 commentaires

0
votes

Cette fonction passera dans vos données et déterminera les plus grandes transitions dans les données. Il les coordonnera ensuite de manière à ce que le même pic ne soit pas émis sur vous lors de l'attrape n code> enregistrements. XXX PRE>

P>

    function getPeaks(data, n = 3, peakList = [] ) {
    	return data.reduce( ( a, v, i, _a, end_index = _a.length - 1 ) => {
    		change = v - _a[ i - 1 ] || 0,
    			mate = i + Math.sign( change ),
    			payload = {
    				change,
    				i,
    				mate
    			};
    		if ( change ) a.peaks.push( payload );
    		return ( i === end_index ) ? ( a.peaks.forEach( _ => {
    			if ( peakList.includes( _.i ) ) return;
    			if ( mate = a.peaks.find( __ => __.i === _.mate ) ) {
    				a.samePeak.push( {
    						highpoint: data[ _.i ] > data[ mate.i ] ? _.i : mate.i,
    						steepness: mate.change > _.change ? mate.change : _.change
    				} )
    				peakList.push( _.i, mate.i );
    			}
    		} ), a ) : a;
    	}, {
    		peaks: [],
    		samePeak: []
    	} ).samePeak.sort( ( _, __ ) => __.steepness - _.steepness )
      .map(({highpoint})=>highpoint)
      .slice( 0, n );
    }

console.log( getPeaks(data, 3) );


0 commentaires