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

MATLAB Discussion :

Erreur dans le remplissage d'un vecteur


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Par défaut Erreur dans le remplissage d'un vecteur
    Bonjour
    J'ai une matrice avec 3 colonnes ( x y z) et .. plein de lignes ^^
    Mon vecteur z a des valeurs dans le désordre. LA premier étape est de les remettre dans l'ordre ,c'est le vecteur Z_sort . Ensuite je repère leur anciens indice dans la matrice et je fait correspondre les valeurs x et y.
    Le problème c'est que parfois il y a plusieurs valeurs de z qui sont identique et donc plusieurs indice. Quand je fais faire correspondres les valeurs x et y , je veux que ces dernières soit dans l'ordre ( vecteur X)
    Si j'ai z=[1 5 2 2 6] et x=[50 90 30 12 100] , je veux Z_sort=[1 2 2 5 6]
    et X=[50 12 30 90 100] , je veux que cela dans l'ordre seulement si plus d'une valeur de z est identique.
    Bon c'est incompréhensible par écrit , j'ai du mal a expliquer :
    J'ai fait un code :

    Code : 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
     
    Z_sort=sort(z);
     
    S=1;
    for n=1:S:numel(x)
        d=[find(Z_sort(n)==z)];
        S=numel(find(Z_sort(n)==z)); 
       if ( S > 1) 
           for j=1:1:S
              tab(j)= x(d(j));
              tab1(j)=y(d(j));
            end
           tab_x=sort(tab);
           tab_y=sort(tab1);
          for j=n:1:(n-1+S)
               X(j)=tab_x(j-n+1);
               Y(j)=tab_y(j-n+1);
     
          end
       end
             tab_x=[];
             tab=[];
             tab1=[];
             tab_y=[];
     
       if (S == 1)
         X(n)=x(d(1));
         Y(n)=y(d(1));
        end
    end
    Le problème vient de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X(j)=tab_x(j-n+1);
               Y(j)=tab_y(j-n+1);
    Quand n=6 et n=7 , cela correspond a 2 valeurs de z identique. Donc il devrait me mettre 2 valeurs de X différentes dans l'ordre ( 98 et 350). Or , dans les 2 "cases" il met 98 et 98 , il met pas le 350.
    C'est frustrant car quand je remplace manuellement n par 6 et je je regarde X(j) dans la console il me met bien les 2 bonnes valeurs

    voila
    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    A tout hasard :


  3. #3
    Invité
    Invité(e)

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Par défaut
    J'ai rajouté un edit a la fin.
    En fait je voudrais garder mon code meme si c'est pas "fluide" car il me semble pas incorrect. Ce que je pige pas c'est quand je met n=6 Manuellement il trouve les bon trucs or quand je laisse faire la boucle , il me met de trucs faux

    Dans le 1er post , si je prends ces valeurs de x ; c'est comme si il me mettait :
    X=[50 12 12 90 100]
    au lieu de
    X=[50 12 30 90 100]

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il met bien les deux valeurs au bon endroit, le problème vient de l'itération qui suit, et qui "devrait" remettre ces deux valeurs, or tu les mets dans les deux cases suivantes.
    Je te propose d'utiliser une boucle while, et d'incrémenter par la valeur de S à chaque itération.

    Remarques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    d=[find(Z_sort(n)==z)];
    S=numel(find(Z_sort(n)==z)); 
    if ( S > 1) 
        for j=1:1:S
            tab(j)= x(d(j));
            tab1(j)=y(d(j));
        end
    Peut être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = Z_sort(n)==z;
    S = sum(d);
    if ( S > 1)
        tab = x(d);
        tab1 = y(d);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for j=n:1:(n-1+S)
        X(j)=tab_x(j-n+1);
        Y(j)=tab_y(j-n+1);
    end
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(n:n+S-1) = tab_x;
    Y(n:n+S-1) = tab_y;

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Par défaut
    Merci je vais essayer mais
    je ne comprends pas ce que tu veux dire :

    "Il met bien les deux valeurs au bon endroit, le problème vient de l'itération qui suit, et qui "devrait" remettre ces deux valeurs, or tu les mets dans les deux cases suivantes."

    A l'itération n=6 , j'ai d= [2 5] par exemple , ca c'est les lignes qui correspondaient au z de l'ancien vecteur non triée. Je lui dis de mettre x(d(1)) et x(d(2)) ( sous forme de boucle ). En fait que je met manuellement n=6 ( je remplace tout les n par 6 ) et je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    S=2
           for j=1:1:S
              tab(j)= x(d(j));
              tab1(j)=y(d(j));
            end
           tab_x=sort(tab);
           tab_y=sort(tab1);
          for j=6:1:(6-1+S)
               X(j)=tab_x(j-n+1);
               Y(j)=tab_y(j-n+1);
               X(j)
    A l'écran , j'ai bien Ans= 98
    Ans=350

    Pourtant j'ai bien fait attention dans la 1ere boucle for a faire varier le pas ( S ) ici S=2 donc il devrait passer direct a n=8 sans Toucher à n=7

    Si jamais j'avais pas la bonne valeurs à l'écran OK c'est faux mais la à l'écran c'est les bonnes valeurs ^^ c'est juste dans le "workspace" quand je regarde mon vecteur il me met 98 98

  7. #7
    Invité
    Invité(e)
    Par défaut
    On va faire cela au débug
    Reprenons ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    z = [1 5 2 2 6];
    x = [50 90 30 12 100];
    On a Z_sort = [1 2 2 5 6].
    1. Première itération, Z_sort(1) = 1, une seule valeur 1 dans z, aucun problème.
    2. Deuxième itération : Z_sort(2) = 2, nous avons deux valeurs dans z en d = [3 4].
      Nous avons ainsi tab = [30 12] et tab_x = [12 30] que nous mettons dans X, dont le nouveau contenu est :
      Pas de problème jusqu'ici donc, c'est ce que nous voulions
    3. Troisième itération, c'est là que cela coince
      Tu as toujours Z_sort(3) = 2, et trouves toujours deux indices (les mêmes 3 et 4).
      Comme précédemment, tu as tab_x = [12 30].
      MAIS, là tu commences ta boucle for j=n:1:(n-1+S) à n = 3 et non plus 2, tu vas donc te retrouver avec X :
    4. Quatrième itération, tu écraseras à son tour la dernière valeur 30.

    J'espère avoir été clair dans mes explications

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

Discussions similaires

  1. [Tomcat] configuration d'une page d'erreur dans web.xml
    Par Super Castor dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 08/04/2009, 15h58
  2. erreur dans programme java sur des vecteurs 3D
    Par HighSchool2005 dans le forum Langage
    Réponses: 18
    Dernier message: 15/02/2007, 16h38
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  4. [Erreur dans la lib...]
    Par Gonath dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/12/2003, 09h02
  5. Erreur dans l'utilisation de SWAP
    Par mire dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2003, 21h39

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