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 une ligne qui contient la valeur NaN [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut Supprimer une ligne qui contient la valeur NaN
    Bonjour à tous !

    J'ai un tableau (vI) dans lequel j'ai des nombres, et dans la colonne 6, j'ai des 'NaN' qui m’embêtent ...
    Je veux supprimer les lignes de mon tableaux qui contiennent un 'NaN' ...

    J'ai essayé plusieurs parades :

    1) isnumeric(vI)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for lig = 1:Dlig
        if isnumber(vI(lig,6)) == false
           vI(lig,:) = [];
        else
            n=n+1;
            vIfinal(n,:)= vI(lig,:);
        end
    end
    Mais quand je demande si une cellule qui contient 'NaN' est numérique, Matlab me renvoie 'true' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    >> vI(:,6)
     
    ans =
     
       300
       NaN
       NaN
     
    >> isnumeric(vI(2,6))
     
    ans =
     
         1
    2) Si cellule = 'NaN'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for lig = 1:Dlig
        if vI(lig,6) == 'NaN'
           vI(lig,:) = [];
        else
            n=n+1;
            vIfinal(n,:)= vI(lig,:);
        end
    end
    Mais je retrouve toujours mes 'NaN' en sortie. Quand je demande à Matlab si une cellule qui contient 'NaN' contient bien 'NaN' ... il me renvoie 'false' :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >> vI(2,6) == NaN
     
    ans =
     
         0
    Bref, un petit cuop de pouce ne serait pas de refus
    merci d'avance !

  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
    Bonjour,


    Dans la solution 2,
    La comparaison de string est strcmp, et non ==.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'oui' == 'o'% compare chaque caractère
    strcmpi('oui','o') % compare les strings
    De pus, il ne faut pas comparer à 'nan' le sous cell array vI(lig,6), mais son contenu vI{lig,6}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    x= {'nan'}
    class(x(1,1))
    class(x{1,1})
    class('nan')
    tu peux obtenir un tableau booleen, et le traiter, sans boucle en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    isnanstr= strcmp(vI,'NaN');
    vi(any(isnanstr,2),:)= []; % deletion des lignes

  3. #3
    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
    Utilise isnan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = magic(6)
    a([1,2,4,6],6) = NaN
    a(any(isnan(a),2),:) = []
    EDIT : Oh, ton "NaN" est en fait une string ?

  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
    Utilise isnan :
    Et en plus, vu que c'est un cell, il faudrait cellfun(@isnan,...)

  5. #5
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Voilà ce que je te propose comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a={1,2;'test',NaN};
    r = cellfun(@(x) all(isnan(x)), a);
    a(r) = {''}
    Est-ce que cela correspond à ce que tu recherches ?

    Magicsmacks

  6. #6
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2011
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Je n'avais pas bien lu ton message.
    Si tu veux supprimer la ligne complète et non seulement la case, et si ton tableau est bien de type cell : essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a={1,2;'test',NaN;2,4};
    r = cellfun(@(x) all(isnan(x)), a);
    mauvaiseslignes = max(r,[],2);
    a(mauvaiseslignes,:) = []
    Et voilà...

    Magicsmacks

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé vos 2 explications (VV33D et ERCO503)
    J'ai finalement choisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(any(isnan(a),2),:) = []
    Qui devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M(any(isnan(M),2),:) = []
    dans mon code car il tourne beaucoup plus vite que ma boucle !


    Ca a l'air de fonctionner sans 'cellfun' ...

    Je sais que
    permet d'appliquer un fonction 'FUN' à chaque cellule du cell-array 'C'

    Mais dans mon cas, j'ai juste une matrice numérique ... 'NaN' n'est même pas reconnus comme un 'string' justement puisqu'avec la fonction ISNUMERIC je n'arrive pas à différencier mes nombres de mes 'NaN'.

    J'ai quand même essayé la proposition de magicsmacks :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    r = cellfun(@(x) all(isnan(x)), M);
    mauvaiseslignes = max(r,[],2);
    M(mauvaiseslignes,:) = []
    Mais cela ne fonctionne pas ...

    Error using cellfun
    Input #2 expected to be a cell array, was
    double instead.
    
    Error in SuppressionNaN (line 70)
    r = cellfun(@(x) all(isnan(x)), M);
    --> Ma matrice n'est donc pas un cell-array. Donc je peux utiliser la version "simple" je crois ?!

    Et l'exemple de magicsmacks me renvoie un résultat "bizarre" (pour moi en tout cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >> a={1,2;'test',NaN;2,4};
    >> r = cellfun(@(x) all(isnan(x)), a);
    >> mauvaiseslignes = max(r,[],2);
    >> a(mauvaiseslignes,:) = []
     
    a = 
     
        [1]    [2]
        [2]    [4]

  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
    Ah voilà, c'est ce que je croyais. Si mon code fonctionne pour tes besoins, c'est que tu mélanges quelques termes.

    Il y a une différence entre un tableau (de cellules) et un tableau (une matrice).

    http://www.mathworks.com/help/matlab...ell-array.html

    Par exemple, ceci est une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >> a = [1,2;3,NaN]
    a =
         1     2
         3   NaN
    Et ceci un tableau de cellules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >> b = {1,NaN;2,'NaN'}
    b = 
        [1]    [NaN]
        [2]    'NaN'
    Aussi, il y a une différence entre 'NaN' et NaN.

    NaN est un résultat numérique (isnumeric) puisqu'il a une classe numérique.

    http://www.mathworks.com/help/matlab/ref/isnumeric.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >> isnumeric(NaN)
    ans =
         1
    >> class(NaN)
    ans =
    double
    Cependant, 'NaN' n'est pas numérique puisque c'est une suite de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >> isnumeric('NaN')
    ans =
         0
    >> class('NaN')
    ans =
    char

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2014
    Messages : 74
    Points : 49
    Points
    49
    Par défaut
    Merci pour ces explications
    Je mélangeais les termes en effet. Maintenant c'est clair.


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

Discussions similaires

  1. Copier une ligne qui contient un caractère particulier
    Par manudibongo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/09/2014, 17h00
  2. Supprimer une cellule qui contient une information
    Par florianc31 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/02/2013, 11h26
  3. [XL-2010] Doublons avec suppression de la ligne qui contient la valeur négatif
    Par medsky74 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 04/02/2013, 14h27
  4. Recuperer la ligne qui a la valeur minimum d'une variable
    Par cedrix57 dans le forum SAS Base
    Réponses: 7
    Dernier message: 06/03/2009, 10h28
  5. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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