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 :

Supprimer les doublons dans la matrice


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Supprimer les doublons dans la matrice
    Bonsoir à tous
    J'ai un problème J'espère que vous pouvez aider
    J'ai une matrice NM
    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
     
    NM =
         9    13     8    11    11    16     9     9    16     2    11     2    16     5     8     7
        15     8     3    11     6     4     8    10     3     7    16    16     3    12     1     7
         6    14    12    10    10    13    15    14    15     6     7    12     4    14    11     14
        12    10     2    13     2     4     7    14     6    14     4    15    10     4     1     12
         9     4     9     9     6    15     5     6     8     2     6     7    12    12     2     3
         3    14    13    13    11    16    11     5    13     3     8    15     6    10     7     7
         5    15    11    15     6     6     2     2     3     4     3     9    11    10    14     14
        12    11     7     9    12     6    16    13    14    15     9    15    11    13    16     9
        15    12     1     8    10     7     3    10     9     7     6     5    12     3    16     6
        11    13     3    10    11     8    15    15     6     9    15     6    16     7     8     2
         6     3    12    12    14     2    14    10     8    12     5     1    12    14    13     15
         9     8    15    11     2     9    14     8    16     6    15    15    11     6     9     1
        13     8     4    15     9     4     2     9     9    16     3    11     5    15     6     5
         7     8    11     8    16    10    12    13     9    12    12     9     6    15    10     2
        13    11    12    10    11    12    11     5     2     7    16     5     9    16     3     4
         7     1    15     2     2    13     4    13     8    14     6    12     2     7    13     10
         8     1    10     5     7     6     7    13    16     9     6     9    10     5    16     7
        12     8     6    16     5    11    15     6    14     8     3    11     6    11     3     10
        10     1     1    11    11     4    13     9    14     4     7     7    10     3     2     2
         9     6    13     9    11    15     3    10     9    12     7     1     7    13    15     5
        13     2    10    14    11     5     1     5    16    16     8    10     3     7     7     15
         3    13     6     9     2     6     5     5     7    16    12    16    13    11    12     2
        14     3     1     1     2     6     3     7     9     3    15    11     5     6     4     2
        11     7     4    12     6    13     8    11     5    15    13     8    12     9     2     16
        15    13     3     2    13     2     7    16     4    14     3     5    14     9     9     7
        11    13     8    14     6     8     1     6    10    15    16    16     1    12    12     1
        10     8     8    14     4    10     8    10     6     9     6    10     7     2     9     15
         2     1    15    12    16     1     8    14    12     1    11     8    16     1    14     9
        14     7     2    16     1    15    14    15    14     3    15     3     1    11     4     1
         3     4    14    13     9     8     6     9     8     6     1     6     3     9    12     3
        10     9    16    16     2     9    14     5     8     2    16     9     8     5    15     4
         7     5    14    10     1     5     8     5     7     4     9    15     5    16    16     9
         6    14    16    15     9    14     6     9    13     5    10    10     2    15    10     15
         5    11    15    15     2    14     7     6     7    14    13    14    11     2     4     7
         6     6     3     8     4    16    11     8     4    10    10     7     5    12    15     3
         9     6    13     5     4    16     9     6     2     2     2    10     2     6    11     12
        15     6     2    16    12     7    13    15     8     2     4    12     6     6    16     14
         8     5    12     6     1     9    16     3     2     7     2     3    16    16     5     12
        12     6    16     9     5    13    11    10     1     2    14     8     4    14     7     10
         5    13     3     1     8    13     7     8     2     1    13     7    13     6    12     7
         4     4     2    12     7     4     8    16     8     6     4     3     5    15     4     6
         4     4     5     9    12     6     5    12    15    10     1    13     8     7     6     1
        13    14    15     6     4     3     2     4     6     8    15    16     1     7    16     4
        15     3     9    10    10     8    16    10    11    13    11     9    12     6     9     3
         5    10     6     2    16     9    16     3     9     4    16    11    14     5     7     5
         1     9    11     1     6    12    16    10     7     3     5     4     5     2     2     1
         6     7    13     3    14     1    13    13     7     7    16    15    14     4     5     8
        10    15     5     5     9    10     3     3    14     8    16     2    13     6    16     9
        10     5    11     2     3     3    14     3     3     6     2     2    10     2    13     1
        10     3     5     6    14    16    10     1     1    13     6     4    14     4    12     3
    Je veux dans chaque ligne de NM numéros de 1 à 16
    Ne doivent pas être des nombres en double
    Comment puis-je corriger la matrice
    et les chiffres de rémunération raffinés
    Exemple : (la première ligne après correction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NM=
    9    13     8    11    1    16     3     6    14     2    12     4    15     5     10     7
    Merci pour tous

  2. #2
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    La fonction unique fait le travail.

  3. #3
    Membre habitué
    Homme Profil pro
    Doctorant LNE Trappes
    Inscrit en
    Mai 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant LNE Trappes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 64
    Points : 174
    Points
    174
    Par défaut
    Le probleme c'est qu'à chaque ligne de ta nouvelle matrice tu n'auras pas le même nombre de termes, donc elle ne pourras pas être créée.

    Je te propose ça avec l'aide de thecrazydonut, à toi de voir après pour affiner la boucle

    Code m : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:size(NM,1)
    a=unique(NM(i,:),'stable');
    b(i,:)=[a zeros(1,size(NM,2)-size(a,2))*NaN];
    end
    b

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Plusieurs solutions possibles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a = [4,2,4,0,1;2,1,3,2,1;4,3,2,1,0]
    b = cellfun(@(x)unique(x,'stable'),mat2cell(a,ones(1,size(a,1)),size(a,2)),'UniformOutput',false)
    b{:}
    maxSize = max(cellfun(@numel,b));
    tmp = cellfun(@(x)[x,nan(1,maxSize-numel(x))],b,'UniformOutput',false);
    c = vertcat(tmp{:})
    EDIT : Plus direct encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = [4,2,4,0,1;2,1,3,2,1;4,3,2,1,0]
    b = cellfun(@(x)unique(x,'stable'),mat2cell(a,ones(1,size(a,1)),size(a,2)),'UniformOutput',false)
    b{:}
    c = cell2mat(cellfun(@(x)[x,nan(1,max(cellfun(@numel,b))-numel(x))],b,'UniformOutput',false))

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut EXPLICATION
    Merci pour tous
    Merci thecrazydonut
    Merci Paul-Ceria
    Merci ERCO503

    Mais les nombres aléatoires sont nécessaires dans chaque ligne de 1 à 16
    Après la suppression de chiffres en double
    Ces chiffres doivent compenser les nombres manquants de 1 à 16 dans chaque ligne

    A titre d'exemple,
    Avant
    la première ligne avant correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NM =
         9    13     8    11    11    16     9     9    16     2    11     2    16     5     8     7
    Après
    la première ligne après correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NM=
         9    13     8    11    1    16     3     6    14     2    12     4    15     5     10     7

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Il y a sûrement mieux à faire en y réfléchissant, mais rapidement ceci pourrait être une astuce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    clear all;
    nm = [9,13,8,11,11,16,9,9,16,2,11,2,16,5,8,7;15,8,3,11,6,4,8,10,3,7,16,16,3,12,1,7;6,14,12,10,10,13,15,14,15,6,7,12,4,14,11,14]
    [u,i] = cellfun(@(x)unique(x,'stable'),mat2cell(nm,ones(1,size(nm,1)),size(nm,2)),'UniformOutput',false);
    i = cellfun(@(x)setdiff(1:16,x),i,'UniformOutput',false);
    i = cell2mat(cellfun(@(x)[x,x(1:max(cellfun(@numel,i))-numel(x))],i,'UniformOutput',false));
    d = cellfun(@(x)setdiff(1:16,x),u,'UniformOutput',false);
    p = cellfun(@randperm,num2cell(cellfun(@numel,d)),'UniformOutput',false);
    d = cell2mat(cellfun(@(x)[x,x(1:max(cellfun(@numel,d))-numel(x))],d,'UniformOutput',false));
    p = cell2mat(cellfun(@(x)[x,x(1:max(cellfun(@numel,p))-numel(x))],p,'UniformOutput',false));
    nm(sub2ind(size(nm),(1:size(nm,1))'*ones(1,size(i,2)),i)) = d(sub2ind(size(d),(1:size(d,1))'*ones(1,size(p,2)),p))

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup ERCO503
    Aujourd'hui seulement essayé après avoir installé "matlab R2013a" (J'ai eu une copie très ancienne)
    Lorsque j'essaie de votre exemple fonctionne bien
    Mais quand j'essaie dans mon propre matrice erreur out

    Mais j'ai trouvé une solution

    merci merciiiiiiiiiiiiiiiiiiiiiiiiii ERCO503

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Effectivement, il y avait un problème dans mon code lorsqu'il y avait plus de la moitié de la ligne qui était des doublons.

    Essaie plutôt ceci :

    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
    clear all;clc;
     
    NM = [9,13,8,11,11,16,9,9,16,2,11,2,16,5,8,7;
    15,8,3,11,6,4,8,10,3,7,16,16,3,12,1,7;
    6,14,12,10,10,13,15,14,15,6,7,12,4,14,11,14;
    12,10,2,13,2,4,7,14,6,14,4,15,10,4,1,12;
    9,4,9,9,6,15,5,6,8,2,6,7,12,12,2,3;
    3,14,13,13,11,16,11,5,13,3,8,15,6,10,7,7;
    5,15,11,15,6,6,2,2,3,4,3,9,11,10,14,14;
    12,11,7,9,12,6,16,13,14,15,9,15,11,13,16,9;
    15,12,1,8,10,7,3,10,9,7,6,5,12,3,16,6;
    11,13,3,10,11,8,15,15,6,9,15,6,16,7,8,2;
    6,3,12,12,14,2,14,10,8,12,5,1,12,14,13,15;
    9,8,15,11,2,9,14,8,16,6,15,15,11,6,9,1;
    13,8,4,15,9,4,2,9,9,16,3,11,5,15,6,5;
    7,8,11,8,16,10,12,13,9,12,12,9,6,15,10,2;
    13,11,12,10,11,12,11,5,2,7,16,5,9,16,3,4;
    7,1,15,2,2,13,4,13,8,14,6,12,2,7,13,10;
    8,1,10,5,7,6,7,13,16,9,6,9,10,5,16,7;
    12,8,6,16,5,11,15,6,14,8,3,11,6,11,3,10;
    10,1,1,11,11,4,13,9,14,4,7,7,10,3,2,2;
    9,6,13,9,11,15,3,10,9,12,7,1,7,13,15,5;
    13,2,10,14,11,5,1,5,16,16,8,10,3,7,7,15;
    3,13,6,9,2,6,5,5,7,16,12,16,13,11,12,2;
    14,3,1,1,2,6,3,7,9,3,15,11,5,6,4,2;
    11,7,4,12,6,13,8,11,5,15,13,8,12,9,2,16;
    15,13,3,2,13,2,7,16,4,14,3,5,14,9,9,7;
    11,13,8,14,6,8,1,6,10,15,16,16,1,12,12,1;
    10,8,8,14,4,10,8,10,6,9,6,10,7,2,9,15;
    2,1,15,12,16,1,8,14,12,1,11,8,16,1,14,9;
    14,7,2,16,1,15,14,15,14,3,15,3,1,11,4,1;
    3,4,14,13,9,8,6,9,8,6,1,6,3,9,12,3;
    10,9,16,16,2,9,14,5,8,2,16,9,8,5,15,4;
    7,5,14,10,1,5,8,5,7,4,9,15,5,16,16,9;
    6,14,16,15,9,14,6,9,13,5,10,10,2,15,10,15;
    5,11,15,15,2,14,7,6,7,14,13,14,11,2,4,7;
    6,6,3,8,4,16,11,8,4,10,10,7,5,12,15,3;
    9,6,13,5,4,16,9,6,2,2,2,10,2,6,11,12;
    15,6,2,16,12,7,13,15,8,2,4,12,6,6,16,14;
    8,5,12,6,1,9,16,3,2,7,2,3,16,16,5,12;
    12,6,16,9,5,13,11,10,1,2,14,8,4,14,7,10;
    5,13,3,1,8,13,7,8,2,1,13,7,13,6,12,7;
    4,4,2,12,7,4,8,16,8,6,4,3,5,15,4,6;
    4,4,5,9,12,6,5,12,15,10,1,13,8,7,6,1;
    13,14,15,6,4,3,2,4,6,8,15,16,1,7,16,4;
    15,3,9,10,10,8,16,10,11,13,11,9,12,6,9,3;
    5,10,6,2,16,9,16,3,9,4,16,11,14,5,7,5;
    1,9,11,1,6,12,16,10,7,3,5,4,5,2,2,1;
    6,7,13,3,14,1,13,13,7,7,16,15,14,4,5,8;
    10,15,5,5,9,10,3,3,14,8,16,2,13,6,16,9;
    10,5,11,2,3,3,14,3,3,6,2,2,10,2,13,1;
    10,3,5,6,14,16,10,1,1,13,6,4,14,4,12,3];
     
    [u,i] = cellfun(@(x)unique(x,'stable'),mat2cell(NM,ones(1,size(NM,1)),size(NM,2)),'UniformOutput',false);
    i = cellfun(@(x)setdiff(1:16,x),i,'UniformOutput',false);
    i = cell2mat(cellfun(@(x)[x,x(mod((1:max(cellfun(@numel,i))-numel(x))-1,numel(x))+1)],i,'UniformOutput',false));
    d = cellfun(@(x)setdiff(1:16,x),u,'UniformOutput',false);
    p = cellfun(@randperm,num2cell(cellfun(@numel,d)),'UniformOutput',false);
    d = cell2mat(cellfun(@(x)[x,x(mod((1:max(cellfun(@numel,d))-numel(x))-1,numel(x))+1)],d,'UniformOutput',false));
    p = cell2mat(cellfun(@(x)[x,x(mod((1:max(cellfun(@numel,p))-numel(x))-1,numel(x))+1)],p,'UniformOutput',false));
    NM(sub2ind(size(NM),(1:size(NM,1))'*ones(1,size(i,2)),i)) = d(sub2ind(size(d),(1:size(d,1))'*ones(1,size(p,2)),p))

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. Supprimer les doublons dans ACCESS
    Par calostephy dans le forum Access
    Réponses: 3
    Dernier message: 08/01/2008, 10h35
  3. Supprimer les doublons dans un vecteur
    Par ecthelion dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 30/11/2007, 09h27
  4. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12

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