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 :

Action X en fonction d'une valeur dans une matrice


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Action X en fonction d'une valeur dans une matrice
    Bonjour,

    Tout d'abord, je tiens à dire que ce forum est une vraie mine d'or ! Bravo aux gens qui y participent. Je viens de m'inscrire, certes je commence par une question, mais j'espère participer à la "vie" ici.

    Bref, voici mon problème :

    Je dois piloter un Robot basé sur NXT avec la bibliothèque RWTH. Jusqu'ici pas de soucis. Cependant, ce rover doit ensuite "dessiner" une image (dans mon cas, une image BMP en 20x20) sur une feuille.

    Ce que je n'arrive pas à faire, c'est d'exploiter la matrice crée via l'image. Je m'explique : la matrice comporte donc seulement 400 valeurs, soit 0 soit 255. Le robot va avancer, stylo baissé tant que les valeurs sont égales à 0. Dès qu'une des valeurs de la colonne passe à 255, le robot continue à avancer mais remonte le stylo tant qu'il n'y a pas un nouveau changement à 0. A la fin de la colonne, le robot fait un virage à 180° pour faire de même sur la deuxième colonne (mais à l'envers, ce qui pose problème également non ?), etc, sur les 20 colonnes de la matrice.

    Cependant, je n'arrive vraiment pas à réaliser le programme.
    J'avais pensé à :

    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
    M = [0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0, 0 0 0 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0] %Deux colonnes pour simplifier
     
    %Ouverture NXT
    Code
     
    %Programme
    while M < 20
        if M(x) == 255
           %Je remonte le stylo
        else
            %J'avance stylo baissé
    end
     
    %Virage
     
    %Je recommence le while
    Bien sur ça ne fonctionne pas. Et du coup, je bloque...

    Quelqu'un pourrait m'apporter quelques idées ?

    Merci beaucoup !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir et bienvenue parmi nous

    Alors commençons par quelques remarques sur ton code actuel :
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      M = [0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0, 0 0 0 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0] %Deux colonnes pour simplifier
      ici tu ne crées qu'un vecteur ligne de 40 valeurs. Je te conseille de lire les paragraphes sur la concaténation horizontale et verticale.
    • while M < 20 Attention à ce genre de condition sur les tableaux et non scalaires : il faut que tous les éléments soient vrais (non nuls) pour que la condition le soit. Ici je pense que tu as voulu plutôt mettre x et non M. Et à ce propos n'oublie pas d'incrémenter ta variable x au sein de ta boucle ou tu risques d'attendre un infinité de temps


    Étant donné que tu procèdes par colonne, commence par mettre en place une boucle pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for col = 1:size(M,2)
        ....
    end
    Pour le parcours dans un sens puis dans l'autre, tu as par exemple la possibilité d'utiliser une variable step qui sera positive/négative selon le sens et qui permettra d'incrémenter/décrémenter l'indice de la ligne.

    Bonne continuation.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    (GROS) EDIT :

    Merci beaucoup de ta réponse et de ton accueil !

    Alors, j'ai recherché un peu avec ton premier conseil. Du coup j'ai [presque] trouvé le bon programme !

    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
    M = [0 0; 255 0; 0 255; 0 255; 0 0; 255 255; 0 255; 255 0; 0 0; 0 0; 0 255; 0 0];
     
    x = 1;
     
    for col = 1:size(M,2)
        while x < 25
            if M(x) == 255
                disp '99';
                pause(1);
                x = x + 1;
            else
                disp '42';
                pause(1);
                x = x + 1;
            end
        end
    end
    Du coup j'ai modifié la matrice (comment ai-je pu oublier ces satanés ";" ? J'ai honte de moi parfois...) et suivis ton code.
    Pour l'instant j'effectue un test avec des affichages de valeurs, car je n'ai pas accès au robot tous les jours (ayant des collègues travaillant dessus également).
    Il affiche donc parfaitement les valeurs demandées au moment où il doit le faire. Je remplacerais les commandes disp par des commandes moteurs une fois que je pourrais tester ce programme sur le robot.

    Mais il reste encore un problème : je ne comprends pas du tout la fonction "step" que tu me donnes. Si j'ai bien tout compris, le logiciel crée un plot de la réponse par échelon de la matrice, et je ne vois pas du tout ce que je peux en faire, et comment incrémenter / décrémenter la variable x pour faire les colonnes paires dans le sens contraire.

    En tout cas, merci de ton aide, c'est vraiment appréciable =)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Si ce n'est déjà fait, je te conseille la lecture entière du tutoriel pointé par mon lien.
    De plus, pense aussi à consulter la documentation des fonctions et mots clés utilisés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    doc size
    doc for
    doc colon % symbole :
    La recherche sur le forum, la FAQ pourront aussi grandement t'aider.

    Commence par un parcours "normal" sans aller-retour des lignes. Ce n'est pas compliqué, c'est quasi du copié coller

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Si ce n'est déjà fait, je te conseille la lecture entière du tutoriel pointé par mon lien.
    De plus, pense aussi à consulter la documentation des fonctions et mots clés utilisés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    doc size
    doc for
    doc colon % symbole :
    La recherche sur le forum, la FAQ pourront aussi grandement t'aider.

    Commence par un parcours "normal" sans aller-retour des lignes. Ce n'est pas compliqué, c'est quasi du copié coller
    Excuse moi, je viens d'éditer mon post plus haut. J'ai eu un problème de compréhension pendant un petit moment, j'ai paniqué mais j'ai finalement résolu le problème pour ordonner au programme d'effectuer une action à telle valeurs. Par contre, le seul problème restant est celui de la fonction step.

    EDIT : Oui, j'ai regardé le tuto sur la conténation

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je t'ai donné les bases de la boucle principale, mais tu ne les utilises pas
    Elle est où l'utilisation de ma variable col ?
    Ici tu as un tableau M deux dimensions, mais ne l'indexes qu'avec un seul indice. Tu es en avance, tu utilises la notions avancée d'indexage linéaire (présente dans le tutoriel), mais là où il faut pas

    Pour la variable step, il suffit d'avoir une ligne row = row + step; avec step qui a pour valeurs 1 ou -1 selon le sens. row étant ici l'indice des lignes tu l'auras deviné

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Haha oui, il m'arrive de faire un peu n'importe quoi en regardant un peu partout.

    Bon, je ferais une modification du programme ce soir, en supprimant l'indexage linéaire. (Je sais pas, je trouve ça presque instinctif comme indexage perso)

    Ah, et merci pour la variable step, je viens de comprendre. Quel idiot je fais parfois !

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Désolé du doublon.

    Pour la variable step, au cas où je ne serais pas plus stupide que mon ombre (ce qui est fort probable), la syntaxe donne bien par exemple ? Aurais-tu un exemple quelconque d'utilisation de cette fonction ? (Je ne suis vraiment pas doué avec ce type de logiciel c'est indéniable )

    D'ailleurs, pour utiliser un indexage plus classique (en utilisant la variable col), j'ai quelques difficultés... Notamment sur le fait que je vois son utilité seulement dans la boucle for.
    J'étais plutôt bien partie sur l'indexage linéaire puisque j'avais réussi à afficher mes nombres en fonction de toutes les valeurs de la matrice. Manque plus que le step justement. Bon après si je l'ai mal placé, c'est un autre chose.

    Je suis vraiment désolé d'être insistant comme ça, mais je ne suis pas du genre à laisser un problème en suspens. Surtout si je débute dans ce type de programme... Ça serait dommage de traîner ces lacunes plus souvent !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    row étant ici l'indice des lignes tu l'auras deviné
    C'est au niveau algorithmique que tu as du mal, pas vraiment MATLAB.
    Je te suggère d'aller faire un tour dans les discussions du sous-forum Images où tu pourras voir pleins d'exemples de parcours 2D.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui en effet, c'est possible.

    Je vais voir ces faqs.

    Merci beaucoup de ton aide en tout cas, c'est vraiment appréciable d'avoir de l'aide de temps en temps

  11. #11
    Invité
    Invité(e)
    Par défaut
    Si vraiment ce parcours aller-retour te gêne, une petite ligne à placer avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M(: , 2:2:end) = M(end:-1:1 , 2:2:end)

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Ah, dommage, je viens seulement de remarquer ton message, j'avais la possibilité de faire des tests sur le robot.

    Soit, j'enregistre ta ligne de code, on ne sait jamais mais j'ai finis par trouver un programme quasi-fonctionnel (j'ai 2 bugs au niveau des moteurs du robot, mais ça sera corrigé rapidement) dans l'ensemble, et parfaitement fonctionnel pour l'analyse de la matrice et les actions en résultant. (Et des aller_retours)

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    %Init
    clear all
    close all
     
    %Ouverture NXT
    h = COM_OpenNXT();
    COM_SetDefaultNXT(h);
     
    %Ouverture de la matrice
    %
    %Ouverture de l'image de la matrice (simulation)
    a = imread('PLAN_SIMU.bmp','bmp');
    %Convertit matrice en type "double" indispensable pour les calculs
    M = double(a);
    %Affiche l'image
    image(M);
     
    x = 1;
    y = 1;
     
    while true
        %Avance en ligne droite
        forward = NXTMotor([MOTOR_B;MOTOR_C]);
        forward.Power = 15;
        forward.SendToNXT();
        %Si colonne impaire
        if y == 1 || 3 || 5 || 7 || 9 || 11 || 13 || 15 || 17 || 19
            while x <= 20 %Tant que l'indice des lignes < 20
                if M(x,y) == 255 %Si la valeur d'une cellule est à 255
                    DirectMotorCommand(MOTOR_A, -90, 90, 'off', 'off', 0, 'off'); %On remonte le stylo
                    StopMotor(MOTOR_A,'off');
                    pause(0.5);
                    x = x + 1; %On incrémente l'indice de la ligne
                else
                    DirectMotorCommand(MOTOR_A, 90, 90, 'off', 'off', 0, 'off'); %On abaisse le stylo
                    StopMotor(MOTOR_A,'off');
                    pause(0.5);
                    x = x + 1; %On incrémente l'indice de la ligne
                end
            end
        end
        pause(1);
        StopMotor('all','off');
        %NXT_ResetMotorPosition(MOTOR_B,'false');
        %NXT_ResetMotorPosition(MOTOR_C,'false');
        %Relève le stylo au cas où il serait baissé
        DirectMotorCommand(MOTOR_A, -90, 90, 'off', 'off', 0, 'off');
        pause(0.3);
        StopMotor(MOTOR_A,'off');
        %NXT_ResetMotorPosition(MOTOR_A,'false');
        %Avance un peu pour combler l'imprécision du virage (fonction)
        marche_avant_distance(5);
        %Demi tour 180° gauche
        demi_tour_robot_g_2(241);
        %On incrémente la colonne et on corrige l'exédant de la variable "x"
        y = y + 1;
        x = x - 1;
        %Ligne Droite
        forward = NXTMotor([MOTOR_B;MOTOR_C]);
        forward.Power = 15;
        forward.SendToNXT();
        %Si colonne paire
        if y == 2 || 4 || 6 || 8 || 10 || 12 || 14 || 16 || 18 || 20
            while x >= 1 %Tant que l'indice des lignes >= 1
                if M(x,y) == 255 %Si une valeur d'une cellule est égale à 255
                    DirectMotorCommand(MOTOR_A, -90, 90, 'off', 'off', 0, 'off'); %On remonte le stylo
                    StopMotor(MOTOR_A,'off');
                    pause(0.5);
                    x = x - 1; %On décrémente l'indice de la ligne
                else
                    DirectMotorCommand(MOTOR_A, 90, 90, 'off', 'off', 0, 'off'); %On abaisse le stylo
                    StopMotor(MOTOR_A,'off');
                    pause(0.5);
                    x = x - 1; %On décrémente l'indice de la ligne
                end
            end
        end
        StopMotor('all','off');
        %NXT_ResetMotorPosition(MOTOR_B,'false');
        %NXT_ResetMotorPosition(MOTOR_C,'false');
        %Relève le stylo au cas où il serait baissé
        DirectMotorCommand(MOTOR_A, -90, 90, 'off', 'off', 0, 'off');
        pause(0.3);
        StopMotor(MOTOR_A,'off');
        %NXT_ResetMotorPosition(MOTOR_A,'false');
        %Avance un peu pour combler l'imprécision du virage (fonction)
        marche_avant_distance(5);
        %Demi tour 180° vers la droite
        demi_tour_robot_d_2(241);
        y = y + 1;
        x = x + 1;
        %Si la matrice a été faite entièrement
        if y == 21
            StopMotor('all','off');
            NXT_ResetMotorPosition('all','false');
            break %On sort de la boucle et stop programme
        end
    end
     
    COM_CloseNXT(h); %Fermeture NXT
    Voici donc ce que j'ai fais. J'ai testé avec l'affichage de valeur ("42" et "99") et cela fonctionne. J'ai donc des bugs au niveau des moteurs, et je dois modifier légèrement mes "while" pour qu'il prenne en compte le fait qu'il y a des moteurs et que l'action de les mouvoir se fasse une seule fois.

    Ne fait pas attention aux commentaires, on m'oblige à les faire...
    (Idem, certaines commandes sont en com, car je les ai "cachées", en essayant de résoudre certains soucis)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if y == 1 || 3 || 5 || 7 || 9 || 11 || 13 || 15 || 17 || 19
    Et si la taille de ta matrice augmente ?
    Alors attention, ce code ne fait pas ce que tu imagines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    y = 2;
    >> y == 1 || 3 || 5 || 7 || 9 || 11 || 13 || 15 || 17 || 19
     
    ans =
     
         1 % et non 0
    Là tu testes y==1 OU 3 non nul ? OU 5 non nul ? OU ...
    Il te faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if y==1 || y==3 ||  y==5 ||  y==7 ||  y==9 ||  y==11 ||  y==13 ||  y==15 ||  y==17 ||  y==19
    Au plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if any(y == [1 3 5 7 9 11 13 15 17 19])
    Et la version "normale" qui marcherait pour des valeurs supérieures
    Idem tu l'auras deviné pour les valeurs paires.

    Sinon mon idée de départ pour le parcours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M = [0   255     0     0   255     0     0   255     0     0     0     0
         0     0   255   255     0   255   255     0     0     0   255     0].';
    step = 1;
    row = 0;
    for col = 1:size(M,2)
        row = row + step;
        for pasBesoin = 1:size(M,1)
            % utilisation de M(row, col)
            row = row + step;
        end
        step = -step;
    end
    Dernière modification par Invité ; 03/04/2013 à 20h07.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci (encore) pour ta réponse !

    Alors en fait, le projet étant en commun, nous avions décidés, la personne devant me "livrer" la matrice et moi d'avoir une taille maximum de 20x20 en fait.

    Merci pour la correction du if, c'est vrai qu'instinctivement je n'aurais pas penser a répéter le y= ou utiliser une fonction spéciale (j'ignorais son existence).

    En tout cas, ton programme m'as l'air a priori bien plus adapte au fait qu'il y ait des moteurs (question de reset position qui ne fonctionnent pas). Je vais le tester sur le robot cet après midi.

    Merci encore

    EDIT :
    Voici le programme résultant, et fonctionnel !
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    %Init
    clear all
    close all
    %COM_CloseNXT all
     
    %Ouverture NXT
    %h = COM_OpenNXT('bluetooth.ini');
    %COM_SetDefaultNXT(h);
     
    %Ouverture de la matrice
    %
    %Ouverture de l'image de la matrice (simulation)
    a = imread('PLAN_SIMU.bmp','bmp');
    %Convertit matrice en type "double" indispensable pour les calculs
    M = double(a);
    %Affiche l'image
    image(M);
     
    step = 1;
    row = 0;
    ph = 0;
    pb = 0;
     
    for col = 1:size(M,2)
        %Déplacement du robot sur la feuille
        %deplacement_feuille();
        row = row + step;
        for pasBesoin = 1:size(M,1)
            % utilisation de M(row, col)
            if M(row,col) == 255
                pb = 0;
                if ph == 1 && pb == 0
                    disp '99';
                    pause(0.2);
                else
                    %stylo_haut();
                    %StopMotor(MOTOR_A,'off');
                    disp '77';
                    pause(0.2);
                    ph = 1;
                end
            else
                ph = 0;
                if pb == 1 && ph == 0;
                    disp '42';
                    pause(0.2);
                else
                    %stylo_bas();
                    %StopMotor(MOTOR_A,'off');
                    disp '24';
                    pause(0.2);
                    pb = 1;
                end
            end
            row = row + step;
        end
        step = -step;
        if bitget(col,1)
            %turn_back_left();
            %demi_tour_robot_g_2(241)
            disp 'demi_tour_gauche';
            pause(0.7);
        else
            %turn_back_right();
            %demi_tour_robot_d_2(241)
            disp 'demi_tour_droite';
            pause(0.7);
        end
    end
     
    %Nettoyage
    %COM_CloseNXT(h);
    Je te remercie (encore une fois) pour ton aide précieuse.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 15
    Dernier message: 26/01/2015, 19h37
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 1
    Dernier message: 25/09/2006, 17h15
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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