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 :

Suppression lignes d'une matrice


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut Suppression lignes d'une matrice
    Bonjour,

    J'ai un petit problème qui paraît tout simple mais que je n'arrive pas à résoudre d'un coup.

    Voici un exemple pour comprendre :

    Soient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A = [ 1 2 3; 4 5 6 ; 7 8 9; 8 5 1; 4 7 6; 1 2 1; 4 7 3; 4 5 6 ; 1 2 8; 3 2 1]
    B = [ 7 ; 9 ]
    J'aimerai bien supprimer les lignes de A semblables (peu importe l'ordre dans lesquelles apparaissent les valeurs) et toutes les lignes de A qui comprennent une valeur de B. le résultat devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = [ 8 5 1 ; 1 2 1 ; 1 2 8]
    Je suppose qu'il faut utiliser les fonctiers any et ismember mais j'arrive pas à les agencer pertinemment. De plus je croyais utiliser la fonction delete mais celle-ci ne me parait pas très adaptée à ce cas-ci...

    Voilà, si vous avez une idée ca m'aiderait vraiment...

    Bonne aprem !

  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 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par bernard6
    J'aimerai bien supprimer les lignes de A semblables
    Trie les colonnes des A et utilise UNIQUE avec le paramètre 'rows'.
    Citation Envoyé par bernard6
    et toutes les lignes de A qui comprennent une valeur de B.
    Allons... un peu de courage. Montres nous ce que tu obtiens.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    J'ai résolu le premier problème. Pour le second, j'arrive à trouver les éléments en commun mais je n'arrive pas à retrouver les indices des lignes de A qui comprennet un de ces éléments.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A = [ 1 2 3; 4 5 6 ; 7 8 9; 8 5 1; 4 7 6; 1 2 1; 4 7 3; 4 5 6 ; 1 2 8; 3 2 1]
    B = [ 7 ; 9 ]
     
    U = unique(sort(A,2),'rows') % toutes les lignes semblables sont supprimées
     
    % On cherche les paires exactes de colonnes de A et de B (triées)
     
    UU = sort (unique (A),2)
    idx = ismember (UU, sort(B,2))
    idx = find(idx) % je connais mtnt les éléments en commun
     
    % je dois maintenant retrouver les lignes de A où apparaissent ces éléments
    J'ai pensé à modifier la matrice A en un vecteur colonne pour retrouver par après la ligne de A mais cela me semble fort lourd... Une fonction de comparaison des valeurs des deux matrices irait bien plus vite... J'ai essayé avec find mais il faut que les dimensions concordent

    PS : vous avez raison, je pose p-e trop vite des questions avant de réfléchir sérieusement sur mon problème... désolé

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Le second problème se résout uniquement avec ISMEMBER et ANY.

    Peut être que cette question de la FAQ te sera utile pour comprendre : Qu'est-ce que l'indexage logique ?

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut
    Voilà j'obtiens le bon résultat pour C (en fait je voulais quand même conserver une ligne qui apparaissait 2 fois dans B)

    J'ai utilisé sextor (et j'aurais pu utiliser intersect à la place de any ismember il me semble).

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    A = [ 1 2 3; 4 5 6 ; 7 8 9; 8 5 1; 4 7 6; 1 2 1; 4 7 3; 4 5 6 ; 1 2 8; 3 2 1]
    B = [ 7 ; 9 ]
     
    U = unique(sort(A,2),'rows') % toutes les lignes semblables sont supprimées
     
    % je dois maintenant retrouver les lignes de A où apparaissent ces éléments
     
    CC = U(any(ismember(U,B),2),:) % équivaut à C =intersect(U,CC,'rows') , non ?
     
    C = setxor(U, CC, 'rows')
    Je vous remercie pour vos conseils Dut.

    Une derniere petite question : les fonctions any ismember sont-elles plus performantes que l'intersect et le sextor ?

    Bonne fin de journée !

  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 304
    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 304
    Points : 52 882
    Points
    52 882
    Par défaut
    Votre solution peut être simplifiée en utilisant l'inverse de la condition logique (~) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A = [ 1 2 3; 4 5 6 ; 7 8 9; 8 5 1; 4 7 6; 1 2 1; 4 7 3; 4 5 6 ; 1 2 8; 3 2 1]
    B = [ 7 ; 9 ]
     
    U = unique(sort(A,2),'rows');
    U = U(~any(ismember(U,B),2),:)

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

Discussions similaires

  1. [Débutant] Suppression des lignes dans une matrice
    Par linda05 dans le forum MATLAB
    Réponses: 9
    Dernier message: 26/03/2014, 16h53
  2. Ajout et suppression de ligne dans une matrice
    Par Ryma_d3 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/01/2012, 19h35
  3. suppression des lignes d'une matrice
    Par sophielow dans le forum MATLAB
    Réponses: 1
    Dernier message: 01/05/2011, 22h58
  4. Tracer une ligne dans une matrice
    Par S4sha dans le forum MATLAB
    Réponses: 4
    Dernier message: 30/05/2006, 15h10

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