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 :

[NaN] Comment s'en débarrasser quand on passe d'une cellule à une matrice ?


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [NaN] Comment s'en débarrasser quand on passe d'une cellule à une matrice ?
    Bonjour !
    Je suis nouvelle sur le forum, et j'espère que vous pourrez m'aider !

    En fait, je suis en train de faire du traitement de données et j'ai un problème qui m'empêche de continuer ...

    J'ai des cellules dans lesquelles j'ai des valeurs, et il y en a certaines auxquelles j'ai attribué NaN (Not-a-Number), et j'essaye de transférer mes valeurs contenues dans ces cellules dans des matrices pour pouvoir créer des fichiers .txt. Et il faut que je me débarrasse de ces NaN. Pour cela, j'ai fait une boucle du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ~isnan(cellule)
           % fait le transfère dans matrice
    end
    mais Matlab me met le message d'erreur suivant : subscripted assignment mismatch (et j'ai vérifié, il m'affiche ça quand il rencontre le NaN).
    Je voulais savoir si le problème vient de "isnan" ? Ou si je dois m'y prendre autrement ?

    Je sais que c'est un problème bête, mais je n'arrive pas à le résoudre et à force je désespère ...

  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
    Un exemple , C est une cellule avec un NAN, my_matrix est une matrice faite à partir de la cellule C sans le NaN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C={1 2 NaN 3}
    my_matrix =cell2mat(C(~cellfun(@isnan,C)))
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour et je te souhaite la bienvenue.

    Commence par nous montrer le code de cette partie, et un exemple de ces cellules
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses rapides =)
    Voici le bout de mon code où j'ai l'erreur :

    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
     
    all_em_d = cell(nb_e, nb_r, nb_i, nb_s);
    em_d_mat = zeros(nb_p, nb_e, nb_r, nb_i, nb_s);
    for s_i = 1:nb_s
        cd '..';
        load E_D;
        % cellule vers matrice
        all_em_d(:,1:4,:,s_i) = E_D(:,:,:,1);
        all_em_d(:,5:8,:,s_i) = E_D(:,:,:,2);
        all_em_d(:,9:12,:,s_i) = E_D(:,:,:,3);
        for i_index = 1:nb_i
            for n = 1:nb_r
                for e = 1:nb_e
                     a = E_D{e,nb_p,i_index,s_index};
                     if ~isnan(a) 
                        em_d_mat(:,e,n,i_index,s_index) = all_em_d{e,n,i_index,s_index};
                    end
                end
            end
        end
    end
    Je voulais mettre en pièce jointe le fichier E_D.mat pour que vous puissiez voir à quoi ça ressemble mais cela ne veut pas marcher car il est trop lourd (environ 60 Mo )...

    Je sais qu'il y a beaucoup de boucles mais j'ai tellement de données que je ne peux pas faire autrement ^^'

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    En fait, je crois que j'ai trouvé le problème.
    Quand j'avais fait, auparavant, l'attribution de NaN dans mes cellules, j'avais 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
     
    for s = 1:nb_s
         for t = 1:nb_t
              if s == 3 && t == 96
                 V_D{t,s} = {NaN};
              end 
              for m = 1:nb_e
                   % fait blabla ...
                   if s == 3 && t == 96
                      E_D{m,t,s} = {NaN}; 
                   end
               end
         end
    end
    Mais quand je regarde E_D{:,96,3}, Matlab n'y a pas attribué NaN, et a laissé les cellules vides (il m'affiche : []). Pourtant, il a bien mis NaN dans V_D (il m'affiche : {1 x 1 cell})

    Du coup, mon problème se situe à un autre niveau (dans l'attribution de NaN dans une cellule en faisant des boucles). Je ne sais pas s'il faut que change le titre de mon post ? ...

    Désolée du dérangement ...

  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
    Juste au passage, il y a me semble-t-il une petite confusion au niveau de l'utilisation des tableaux de cellules.

    Pourquoi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> X{1} = {NaN}
     
    X = 
     
        {1x1 cell}
    alors qu'il suffit simplement de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> X{1} = NaN
     
    X = 
     
        [NaN]
    ?
    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)

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Normalement, le contenu de mes cellules est de la forme : [5001 x 1 double]. Il me semblait donc que c'était mieux de faire {NaN} au lieu de NaN tout court.
    En même temps, j'en sais rien

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> X{1} = NaN
     
    X = 
     
        [NaN]
     
    >> X{2} = rand(5001,1)
     
    X = 
     
        [NaN]    [5001x1 double]
    Tout simplement
    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)

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour tout, vous m'avez beaucoup appris

    Aussi, quand j'ai essayé de faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if X{i,4,3,3} == NaN
        X{i,4,3,3} = {0};
    end
    Matlab m'a dit que 'eq' ne peut pas être utilisé pour les cell. J'ai pu contourner le problème en utilisant length etc., mais je voulais savoir quel est le signe qu'on utilise pour dire "==" pour cell ?

    Par ailleurs, si vous pouviez m'expliquer le rôle de @ dans le code suivant :
    Citation Envoyé par tug83 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_matrix =cell2mat(C(~cellfun(@isnan,C)))

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_matrix =cell2mat(C(~cellfun(@isnan,C)))
    Et j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ??? Erreur using ==> cellfun
    Non-scalar in Uniform output, at index 1, output 1
    Set 'UniformOutput' to false.
    Quand je mets "'UniformOutput',false", il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ??? Erreur using ==> cellfun
    Undefined function or method 'isnan' for input arguments of type 'cell'.
    Voici ce à quoi ressemble mes données :
    http://hotfile.com/dl/37889103/e6be142/my_ed.mat.html

    Désolée pour les messages multiples

  11. #11
    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 freesia Voir le message
    Aussi, quand j'ai essayé de faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if X{i,4,3,3} == NaN
        X{i,4,3,3} = {0};
    end
    Depuis le début tu te compliques la tâche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> X{1} = NaN
     
    X = 
     
        [NaN]
     
    >> isnan(X{1})
     
    ans =
     
         1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >> X{1} = {NaN}
     
    X = 
     
        {1x1 cell}
     
    >> isnan(X{1})
    ??? Undefined function or method 'isnan' for input arguments of type 'cell'.
    Tu vois la différence ou pas ?
    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. Réponses: 6
    Dernier message: 22/10/2009, 15h42
  2. executer une macro quand on change la valeur d'une cellule
    Par Benwad dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 23/02/2009, 18h54
  3. Réponses: 2
    Dernier message: 15/01/2009, 11h21
  4. Réponses: 17
    Dernier message: 24/11/2006, 18h25
  5. comment passer d'une cellule à une autre
    Par khier dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/04/2006, 17h35

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