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 :

recherche des éléments dans une matrice et groupement de ces éléments


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut recherche des éléments dans une matrice et groupement de ces éléments
    Salut;
    bon je vais expliquer mon problème par un exemple.
    Soit un matrice M:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    M =[15 15 3; 12 30 7 ; 28 60 62]
     
    M =
     
        15    15     3
        12    30     7
        28    60    62
    je vais faire une recherche sur chaque élément de ce matrice et grouper les éléments qui sont égaux ou bien ont une différence entre eux de +-3 dans le même groupe et je donne un nom à ce groupe.

    donc on obtient la matrice qui contient les numéros des groupes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    G = [1 1 2; 1 3 4; 3 5 5]
     
    G =
     
         1     1     2
         1     3     4
         3     5     5
    Enfin on obtient 5 groupes
    toujours Merci pour vos aides

  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 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Voici un algorithme très simple :



    1. Fais une copie de ton tableau M dans Mcopie
    2. Tu prends la première valeur de M différente de NaN
    3. Tu la soustrais à toutes les autres valeurs
    4. Tu prends la valeur absolue du résultat.
    5. Tu trouves toutes les valeurs de M pour lesquels le résultats est inférieur ou égal à 3
    6. Tu mets les valeurs correspondantes dans Mcopie à 1.
    7. Tu mets les valeurs correspondantes dans M à NaN
    8. Retour au point 2) tant que les valeurs de M ne sont pas toutes des NaN


    Les fonctions utiles : WHILE-END, ISNAN, ABS, FIND...
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    merci
    c'est quoi mcopie est ce que c'est une nouvelle matrice.
    mais ce n'est pas simple ce algorithme

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    pourquoi on utilise la notion des NAN
    MERCI

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    OK J'AI COMPRIS
    MERCI JE M'EXCUSE POUR LE DÉRANGEMENT

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par jena Voir le message
    c'est quoi mcopie est ce que c'est une nouvelle matrice.
    Exactement :

    Si c'est plus simple à comprendre, tu peux mettre des 0 dans Mcopie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Mcopie = zeros(size(M));
    Citation Envoyé par jena Voir le message
    pourquoi on utilise la notion des NAN
    Parce que si tu remplaces les valeurs "égales" par 1,2,3,4,... tu risques de comparer à nouveaux ces valeurs si tu rencontres par exemple la valeur 1 plus loin dans la matrice M

    Par exemple si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M = [15 12 ; 12 1];
    et
    A la première itération, si tu remplaces les valeurs "égales" à 15 (à +/- 3 près) tu obtiens :

    et
    Et la prochaine valeur vaut 1, donc tu reprendrais les valeurs que tu viens de modifier.

    Donc Mcopie deviendrait
    Alors qu'en utilisant des NaN, la matrice M devient :

    et
    Donc tu ne testes plus que le dernier 1 donc Mcopie devient :
    Citation Envoyé par jena Voir le message
    mais ce n'est pas simple ce algorithme
    Par simple, je ne voulais pas dire "facile" mais "seulement" dans le sens que ce n'est pas un code tout fait. Donc ma phrase voulait dire : "voici seulement un algorithme"
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    je n'ai pas connu comment utiliser le nan

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    je fais ce code mais il ne donne pas le résulat souhaité
    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
    mcopie = [0];
    j =1;
    for i = 1:length(m)
       for k = 1:length(m)
      if i~=k && m(k) ~= 0 && abs(m(i)-m(k))< 12 
        m(k) = 0;
        lab = j;
    %   else
    %     lab =0;  
     
     mcopie =[mcopie lab];
     end
       end
       j= j+1;
    end
    mcopie = mcopie(2:length(mcopie))
    voila le résultat:
    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
     
    m =
     
      Columns 1 through 9 
     
      114.4409  114.0404  229.0916  344.4099  114.0404  228.4813  115.0513  230.3696  229.0916
     
      Columns 10 through 16 
     
      115.0513  343.5326  115.3183  344.4099  230.3696  115.3183  458.8509
     
     
    mcopie=
     
         1     1     1     1     1     1     3     3     3     3     4     4

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Tu dois faire les opérations directement sur la matrice entière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M =[15 15 3; 12 30 7 ; 28 60 62]
     
    temp = abs(M-15)
     
    [r,c] = find(temp<=3)
    Le tout dans une boucle WHILE-END
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    comment tous dans le boucle while end

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Si tu as bien suivit l'algorithme, tu remplace chaque valeur identique (à +/- 3 près par des NaN).

    Tu dois donc boucler tant que toutes les valeurs dans la matrice initiale ne sont pas toutes des NaN

    Pour faire ce test, tu peux combiner les fonctions ISNAN et ALL
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. recherche des indices dans une matrice
    Par gueloude dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/01/2011, 14h34
  2. rassembler des éléments dans une matrice
    Par frenchero dans le forum MATLAB
    Réponses: 1
    Dernier message: 10/11/2009, 13h02
  3. recherche des doublons dans une hash
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 29/01/2007, 11h51
  4. Recherche des symboles dans une lib c++
    Par firens dans le forum MFC
    Réponses: 4
    Dernier message: 31/03/2006, 14h56
  5. Recherche des coefficients d'une matrice 3x3
    Par colorid dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/11/2004, 16h52

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