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 :

Enlever valeurs nulles d'une boucle avec condition


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut Enlever valeurs nulles d'une boucle avec condition
    Bonjour, je me permets de vous contacter, car j'ai un problème, le code fait apparemment ce que je lui demande, cependant quand la condition "Global" n'est pas respectée le fichier Exposition2 à une valeur nulle.

    ça me fait un truc du style

    [] [] []

    [] [] []

    A 0,1 44

    Donc pour les 2 premières lignes les conditions ne sont pas respectée donc j'ai une valeur nulle.

    Moi je souhaite que ça me donne ça :

    A 0,1 44

    Bref que ça enlève les valeurs nulles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for j = 1:size(nom_fichier,1) %taille de l'echantillon 
    for i = 1:numel(Exposition.([Type_dossier nom_fichier(j,:)]).textdata(:,5)) %taille de l'echantion 
        if ne(strcmp('GLOBAL',Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,5)), 0); %Condition si la valeur est Global 
            %Fichier exposition contenant les valeurs filtrés 
     
            Var1 = Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,4); %Ensemble de variable à copier 
            Var2 = Exposition.([Type_dossier nom_fichier(j,:)]).data(i,1);
            Var3 = Exposition.([Type_dossier nom_fichier(j,:)]).data(i,2);
     
             Exposition2.([Type_dossier nom_fichier(j,:)])(i,:) = [Var1 Var2 Var3];
        end
    end
    end
    Merci pour votre aide

  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
    Il y cell array dans lequel tu écris à l'indice i plus grand que end+1, ce qui rajoute des éléments vide. Il faut insérer à l'emplacement end+1 et non i.
    Voici un exemple équivalent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    x={};
    x{2} = 'quelquechose';
    x % contient [] à l'emplacement 1
     
    x={};
    x{end+1} = 'quelquechose';
    x %  pas de [] insérés

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je ne connaissais pas cette possibilité je test ça merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    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 j = 1:size(nom_fichier,1) %taille de l'echantillon 
    for i = 1:numel(Exposition_brut.([Type_dossier nom_fichier(j,:)]).textdata(:,5)) %taille de l'echantion 
        if ne(strcmp('GLOBAL',Exposition_brut.([Type_dossier nom_fichier(j,:)]).textdata(i,5)), 0); %Condition si la valeur est Global 
            %Fichier exposition contenant les valeurs filtrés 
             
            Var1 = Exposition_brut.([Type_dossier nom_fichier(j,:)]).textdata(i,4); %Ensemble de variable à copier 
            Var2 = Exposition_brut.([Type_dossier nom_fichier(j,:)]).data(i,1);
            Var3 = Exposition_brut.([Type_dossier nom_fichier(j,:)]).data(i,2);
            
             Exposition_Raf.([Type_dossier nom_fichier(j,:)])(end+1,:) = [Var1 Var2 Var3];
        end
    end
    end
    C'est bien ça qu'il faut faire ? mais j'ai toujours le même problème

  5. #5
    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
    Du coup c'est surement la création de Var1 ,2,3 qui fait cela. Pour quoi la boucle sur i ? Tu dois pouvoir traiter les vecteurs dans leur ensemble sans boucler dessus.

    Je te conseilles d'y aller en mode debug. Mets un point d’arrêt au début, exécute pas à pas et vérifie quelle ligne est responsable du problème.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Le problème c'est que j'ai pas d'erreur.

    ça tourne bien sauf que j'ai des lignes cellules [] et en debug mode ça me trouve rien

  7. #7
    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
    Le mode debug est utile même sans erreur ! Tu executes ligne à ligne, tu vérifie a chaque fois la tete de ta variable, jusqu'à trouver quelle ligne t'as insérer un []

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    On est d'accord que pour faire ça je mets des breakpoints sur différentes lignes de mon code et je fais ctrl + entrée ? ça me lance tout le code :/

    Bon c'est un peu crade mais en inversant le if et le for ça fonctionne.

  9. #9
    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
    Non tu mets un seul breakpoint au début et ensuite F10 (avance d'une seule ligne).

    Inverser le if et le for n'a aucun sens puisque la condition dépend des indices de boucle.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je crois que ça ne fonctionne pas.

    Nom : 652667Capturedcran20140721151429.png
Affichages : 137
Taille : 78,6 Ko

    On est d'accord que j'ai bien mis le breakpoint , sur mac le debug est F7 (le raccourcie step) d'après : matlab -> préférence -> keybord -> shortcut

    Mais il semble que rien ne se passe

  11. #11
    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
    mets le point sur une ligne avec un instruction, puis enregistre ! (le point doit en être rouge, pas noir)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Bien tout fonctionne.

    Pour les 40 premières valeurs de i la condition n'est pas respectée donc les var1,var2,var3 prennent la valeur vide.
    et après à la 41ème la condition est respectée donc var1,var2,var3 prennent les bonnes valeurs

    Le problème c'est que ça stock les 40 premières valeurs vide. Puisque je lui dit de les mettre en i.

  13. #13
    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
    Les [] sont ils insérés progressivement, ou au moment de l'écriture de la 41eme ?
    Essaye avec end+1 au lieu de i

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Ils sont insérés progressivement je test à nouveau avec un end+1

    Edit : Je crois je dis une connerie la variable n'est pas crée tant qu'on a que du vide.

    Je retest

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je confirme, la variable se créer qu'une fois que la condition est respectée
    Avant il ne se passe rien pour les 40 premières valeurs.

  16. #16
    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
    Et à ce moment la (en point d’arrêt), que renvoient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    size(exposition_Raf.([Type_dossier nom_fichier(j,:)]))
    class(exposition_Raf.([Type_dossier nom_fichier(j,:)]))
    size([Var1 Var2 Var3])
    class([Var1 Var2 Var3])

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Ok j'avais pas vu le problème de nom je fais tourner ça merci pour ton aide.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Bon c'est pas à la 40ème valeur mais à la 53eme valeur de la boucle que ça tourne ça rempli la condition.

    Donc en faisant au breakpoint je n'ai rien pendant 52 tours de la boucle.

    à la 53ème j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    size(exposition_Raf.([Type_dossier nom_fichier(j,:)])) = 53 3 
     
    class(exposition_Raf.([Type_dossier nom_fichier(j,:)])) = cell
     
    size([Var1 Var2 Var3]) = 1  3 
     
    class([Var1 Var2 Var3])= cell
    Ensuite pour les autres pas de la boucle seul la première ligne change, 54, 55, 56 ...

    ça donne une idée du problème ?

    Merci pour votre aide

    Quand je mets end+1 au lieu de i ça me mets :

    Reference to non-existent field 'NY20131213'.

    Error in Script (line 134)
                Exposition_Raf.([Type_dossier nom_fichier(j,:)])(end+1,:) =
                [Var1 Var2 Var3];
     

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Ce code ne serait pas sensé arranger le problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D(cellfun(@(D) isempty(D),D))=[];
    Le problème c'est qu'il n'accepte pas ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Exposition_Raf.([Type_dossier nom_fichier(j,:)])(cellfun(@(Exposition_Raf.([Type_dossier nom_fichier(j,:)])) isempty(Exposition_Raf.([Type_dossier nom_fichier(j,:)])),Exposition_Raf.([Type_dossier nom_fichier(j,:)])))=[];
    end

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Rien à faire, même en ajoutant une condition pour que les Var1, Var2, Var3 ne soient pas vident j'ai toujours ce problème

Discussions similaires

  1. [E07] erreur sur une boucle avec condition
    Par rvtoulon dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 18/03/2009, 14h59
  2. Réponses: 2
    Dernier message: 26/01/2009, 15h38
  3. Update dans une boucle avec valeur incrémentale
    Par framus.class dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2008, 11h19
  4. Créer une boucle avec condition
    Par mfontan dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/06/2008, 17h14
  5. Valeur Null dans une condition
    Par jmde dans le forum VBA Access
    Réponses: 8
    Dernier message: 29/07/2007, 04h48

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