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 :

Détecter les lignes identiques entre deux matrices


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Détecter les lignes identiques entre deux matrices
    Bonjour,
    voila, mon problème, j'ai deux matice A et B de dimensions (n,3) et (m,3) "nombre de lignes variable"
    je voudrai rechercher les lignes de A identiques à celles de B et les supprimer de la matrice A. je sais c'est tout simple, mais ça me prend la tête grave.

    ex de ce que j'ai fait

    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
    A = [ 1  2   3
           4   5   6
           7   8   9
         10  11 12];
     
    B = [ 4  5  6
            3  2  1
          10 11 12
            7  9  8
            4  2  1];
     
    for i=1:4
        for j=1:5
            if A(i,:)==B(j,:)
               A(i,:)=[];
            end
        end
    end
     
    % je trouve un resultat correcte dans la matrice A à la fin 
    (c'est à dire [4 5 6
                      7 8 9]
    mais il y a une erreur qui s'affiche comme quoi j'ai dépassé la dimension de la matrice ???
    je vous remercie d'avance les gars.

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    je suppose que tu as le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? Index exceeds matrix dimensions.
    que dutmatlab explique dans sa FAQ
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Pour l'erreur : au début A a bien 4 lignes mais ensuite ???
    Une idéee : faire une boucle "à l'envers" ie avec un pas -1.

    Sinon ça me parait un peu compliqué. Je suis sure qu'il y a déjà une fonction Matlab qui pourrait t'aider, du genre find avec l'option 'rows' (je n'ai pas MTB sous les yeux...).

    Et puis A(i,:)==B(j,:) c'est pas top comme condition c'est plus propre de mettre :
    if all(A(i,:)==B(j,:))
    Comme ça tu obtiens bien un booléen dans ta condition.

    Ah aussi ton exemple me parait bizarre, la matrice que tu obtiens contient donc les lignes [4 5 6] qui est dans A ET B, et [7 8 9] qui est dans A mais pas dans B :koi:
    Règles du Forum

    Adepte de la maïeutique

  4. #4
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Tu peux simplifier ton code en utilisant la fonction ismember:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d=~ismember(A,B,'rows');
    A=A(d,:);
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  5. #5
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rostomus
    Bonjour,

    Tu peux simplifier ton code en utilisant la fonction ismember:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d=~ismember(A,B,'rows');
    A=A(d,:);
    Impressionnant !
    Je m'étais moi aussi fendu de mon petit tas de code pour fusionner sans doublons deux tableaux il y a pas si longtemps que ça.

    OL
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  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 rostomus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d=~ismember(A,B,'rows');
    A=A(d,:);
    Et pour être complet, l'autre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d=ismember(A,B,'rows');
    A(d,:)=[]
    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. [Gestion de fichiers] Lister les lignes identiques entre deux fichiers
    Par |Psk| dans le forum Utilitaires et Sécurités
    Réponses: 0
    Dernier message: 11/02/2015, 09h09
  2. Réponses: 13
    Dernier message: 05/02/2013, 16h43
  3. Réponses: 11
    Dernier message: 04/02/2012, 18h24
  4. Trouver les éléments non communs entre deux matrices
    Par Décembre dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/10/2011, 18h31
  5. [Free Pascal] Détecter les lignes identiques dans deux tableaux de texte
    Par jeanmich dans le forum Free Pascal
    Réponses: 11
    Dernier message: 10/01/2009, 15h43

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