IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Changement de valeurs d'un vecteur


Sujet :

Mathématiques

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut Changement de valeurs d'un vecteur
    Bonjour,

    Je pense que mon problème est simple mais bon je n'ai trouvé que des solutions compliquées !

    En fait j'ai un vecteur (en c++ conteneur STL) qui contient une suite de valeurs (0 ou 1) et je voudrais savoir si il existait un algorithme simple permettant de connaitre le nombre de changements de valeurs et la durée de ceux-ci, par exemple:

    0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 : 2 changement de valeurs identifiés dont 1 d'une durée de 3 échantillons et un autre d'une durée de 6 échantillons.

    J'espère m'être bien expliqué ^^ ! En attendant voila mon algo en c++ (je fais appel à votre indulgence :

    Code c++ : 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
    32
    33
    34
     
    int Discrete::find_state_change(std::map<int, int>& consecutive)
    {
         int initial_state=0; //Valeur au rang n
    	 int np1_state=0; //Valeur au rang n+1
    	 int nbr_mauvais=0; //Nombre d'echantillon à l'état changé
    	 int nbr_change=0; //Nombre de changement
    	 std::vector<int>::iterator iter=value.begin(); //Iterateur sur le premier élément du vecteur
    	 while(iter!=value.end()) //tant que l'on ne pointe pas sur la fin du vecteur
    	 {
    	     initial_state=(*iter); //Valeur au rang n
    		 iter++; //On pointe sur n+1
    		 if(iter!=value.end()) //Si on ne pointe pas sur la fin du vecteur
    		 {
    		     np1_state=(*iter); //Valeur au rang n+1
    		     if(np1_state!=initial_state) //Si v(n+1)<>v(n)
    		     {
    		         nbr_change++; //Nombre de changement + 1
    				 //Tant que v(n+1) différent de l'état avant changement et de la fin du vecteur
    			     while(np1_state!=initial_state && iter!=value.end()) 
    			     {
    			         nbr_mauvais++; //Nombre d'echantillon à l'etat changé + 1
    					 iter++; //On pointe sur n+1
    				     np1_state=(*iter); //Valeur au rang n+1
    			     }
    			     consecutive[nbr_mauvais]=consecutive[nbr_mauvais]+1; //On remplit le conteneur associatif
    				 //consecutive[nombre d'echantillon à l'etat change]= compteur sur le nombre de changement
    				 //de taille égale
    			     nbr_mauvais=0; //On reinitialise nbr_mauvais
    		     }
    		 }
    	 }
    	 return nbr_change;
    }

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Le plus simple c'est de calculer la différence entre 2 éléments consécutifs:

    si différence = +1 => passage de 0 a 1
    si différence = -1 => passage de 1 a 0
    si différence = 0 => plateau (constant)

    Seul le premier cas t'intéresse.

    En Java (pas de C++ sous la main, désolé) ca ferait quelque chose comme:
    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
    int findStateChange(List<Integer> values) {
    	int previous=0,current=0,changecount=0;
     
    	Iterator<Integer> iter = values.iterator();
    	if (!iter.hasNext()) return 0; // list is empty
     
    	current = iter.next();
    	while(iter.hasNext()) {
    		previous = current;
    		current  = iter.next();
    		if (current-previous>0)	changecount++;			
    	}
    	return changecount;
    }

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    en fait c'est juste une analyse d'histogramme, en gros...


    Et comme le dit pseudocode, une analyse des transitions est simple..

    Code C :

    Code C : 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
    32
    33
    34
    35
    36
    37
    typedef struct pChange {
          int Start ;
          int Width ;
    } Change ;
     
     
    int FindStateChanges ( int *Table, int Nelts, Change **Changes )
    {
       int NChanges = 0, i, iend=-2 ;
     
       for ( i = 0 ; i < Nelts ; i++ )
         {
             if ( Table[i] )
               {
                    if ( iend < (i-1) )
                     {
                        *Changes = realloc ( *Changes, (NChanges+1)*sizeof(Change) );
                        if ( *Changes == NULL )
                          { 
                              NChanges = 0 ;
                              break ;
                          }
                        (*Changes)[NChanges].Start = i ;
                        (*Changes)[NChanges].Width = 1 ;
                        NChanges++ ;
                    }
                  else
                    {
                        (*Changes)[NChanges-1].Width ++ ;
                    }
     
                  iend = i ;
               }
         }
     
       return NChanges ;
    }

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut
    Merci pour vos réponse je vais essayer de simplifier mon algo a partir de celles-ci !

    A + sur le forum !
    Darki03

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2006, 11h55
  2. Changement de valeur
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/11/2005, 00h31
  3. Changement de mes tableaux en vecteur
    Par Bason_sensei dans le forum MFC
    Réponses: 11
    Dernier message: 22/10/2005, 18h24
  4. Réponses: 1
    Dernier message: 29/09/2005, 11h10
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/01/2005, 08h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo