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 ligne avec NaN [Débutant]


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Suppression ligne avec NaN
    Salut à tous,

    J'ai un cell de 101 lignes et 3 colonnes. Le truc c'est que dans certaines colonnes il y a des NaN, je veux donc supprimer toutes les lignes de ce cell où il y a des NaN et ce pour les 3 colonnes.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = cellfun(@(x) isempty(x) || any(isnan(x)) , monCell)
    monCell(idx) = [];
    Ensuite, dans la fenêtre de commande je vois que ma cell "traitée" est totalement bizarre car on y voit que des 0 et 1 alors qu'avant il n'y avait rien de cela...

    Avez-vous une idée ?

    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Dans la fenêtre de commande, tu vois le vecteur booléen idx (pas <;> à la fin de la ligne).

    Si monCell est vraiment de dimension [101,3], la suppression de ligne s'écrit monCell(idx,: ) = [];
    De même, il faut préciser la dimension 2 à any : idx = cellfun(@(x) isempty(x) || any(isnan(x),2) , monCell)

    Mais peut être monCell est-il un cell de taille [101,1] contenant des cells ou matrice [1,3] ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Non, monCell est bien de dimension [101,3].

    J'ai essayé les modifs énoncées et il apparait le message suivant :
    Matrix index is out of range for deletion. à propos de la ligne de commande
    Citation Envoyé par VV33D Voir le message
    Dans la fenêtre de commande, tu vois le vecteur booléen idx (pas <;> à la fin de la ligne).

    Si monCell est vraiment de dimension [101,3], la suppression de ligne s'écrit monCell(idx,: ) = [];
    De même, il faut préciser la dimension 2 à any : idx = cellfun(@(x) isempty(x) || any(isnan(x),2) , monCell)

    Mais peut être monCell est-il un cell de taille [101,1] contenant des cells ou matrice [1,3] ?

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Effectivement, le cellfun va map chaque cellule et non pas chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    idx= any(cellfun(@isnan,monCell),2); % indices de lignes avec un nan
    As-tu vraiment besoin de tester @isempty ? cela complique légèrement la recherche car le cellfun ci dessus ne sera pas uniforme. Dans ce cas, le plus simple est peut etre un arrayfun(..., 1:size(monCell,1))

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    En effet, pas besoin de faire le isempty pour le moment. Par contre, en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx= any(cellfun(@isnan,monCell),2); 
    monCell(idx) = [];
    Il apparait un nouveau message d'erreur : Non-scalar in Uniform output, at index 1, output 1.
    Set 'UniformOutput' to false.


    J'ai donc intégré les options 'UniformOutput', false au cellfun mais encore un problème qui apparait... :
    Undefined function 'any' for input arguments of type 'cell'.

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Ca me choque mais passons, matlab détermine l'uniformité de ses outputs comme un grand.
    Effectivement, si une cellule contient une matrice, on aura un problème

    Voici un workaround:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    % soit
    idx= any(cellfun(@(x) isequaln(x,nan),monCell),2);
    % soit
    idx= any(cellfun(@(x) any(isnan(x)),monCell),2);
     
    monCell(idx,:) = []; % attention à indexer les lignes et pas le cell

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    re VV33D,

    Je t'ai envoyé un message privé pour plus d'infos...

  8. #8
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,
    Je n'ai pas compris pourquoi cela ne marchait pas.
    Passez par le forum plutôt que les MPs pour les questions techniques, cela permet à d'autres d'avoir les réponses.

    Que donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    isequaln(nan,monCell{1,1}); isequaln(nan,monCell{1,2}); isequaln(nan,monCell{1,3}) ; isequaln(nan,monCell{2,1})

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    OK très bien,


    Il semblerait qu'il y ait toujours un problème.

    Cependant, je dois peut être te donner d'autres précisions sur mon travail.

    Mon fichier lit des données depuis un fichier excel par la fonction xlsread et sa syntaxe (num, text, raw). Ces données sont des chiffres mais aussi des lettres. Je récupère ensuite le "raw" qui comporte les chiffres et les lettres que j'ai besoin de traiter. Il a cette allure (les 8 premières lignes ici...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        'Date'	                            'Lieux'	                                NaN
    '15/02/2014'	                     'BRETIGNOLLES SUR MER 	                   'np'
         NaN	                             NaN	                                NaN
    '20/02/2014'	                                NaN	                                'pel'
         NaN	                             NaN	                                NaN
         NaN	                             NaN	                                NaN
    '02/03/2014'	                    'PAYS D AIGRE'	                           'pel'
    '02/03/2014'	                    'ST CHRISTOPHE '	                          NaN

    Ce "raw" est considéré comme un Cell (101 x 3) par Matlab mais il y a des lignes comportant des NaN comme vous le voyez.

    Je veux donc supprimer toutes les lignes de mon Cell qui comprennent un NaN sur une des colonnes.

    Merci .

    Concernant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isequaln(nan,monCell{1,1}); isequaln(nan,monCell{1,2}); isequaln(nan,monCell{1,3}) ; isequaln(nan,monCell{2,1})
    il apparait aussi un message d'erreur notifiant que :
    [QUOTE]Undefined function 'isnan' for input arguments of type 'cell'.[/QUOTE

  10. #10
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Je trouve cette erreur très suspecte ! tu as vraiment utilisé isequaln() et pas juste isnan() ?

    Que donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class(monCell), class(monCell{1,1}), class(monCell{1,2}), class(monCell{1,3}), class(monCell{2,1})

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Re,

    Je ne comprends pas tout, je viens de ré-essayer le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx= any(cellfun(@(x) any(isnan(x)),CoursePlaceDate),2);
    et tout marche parfaitement !

    Merci encore pour to aide.

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

Discussions similaires

  1. [XL-2003] Macro suppression ligne avec condition
    Par jenifer699 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/08/2012, 12h43
  2. [XL-2003] Macro suppression ligne avec condition 3 mots
    Par jenifer699 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/08/2012, 17h45
  3. [XL-2003] Recherche et suppression ligne avec condition
    Par jeromeph75 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/05/2011, 10h31
  4. [AC-2000] Suppression ligne avec conditions sur deux tables
    Par Loufink dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 09/07/2009, 11h38
  5. Suppression ligne d'un dbgrid avec query
    Par Mihalis dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/09/2006, 19h17

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