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 :

Trouver Nan dans une colonne et effacer lignes de plusieurs tableaux


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut Trouver Nan dans une colonne et effacer lignes de plusieurs tableaux
    Bonjour à tous,
    ca fais des heure que j'essaye de régler mon problème, je n'arrive pas à faire ce que je veux.

    J'ai 8 tableaux de 1152lignes par 5 colonnes, avec dedans un timestamp, et 4 valeurs par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '2013-11-01 00:00:00'	223	175	6	199
    ce que je souhaite c'est lorsque il y a un Nan dans une des 4 valeurs, c'est effacer la ligne de tous mes tableau.
    Mais je ne voit pas trop comment faire, mes tableaux sont dans une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    infrastructure.capteur(1,1).tableau %1er tableau
    infrastructure.capteur(2,1).tableau %2eme tableau
    ...ainsi de suite
    Il faut donc que je repere les Nan en premier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a =infrastructure.capteur(1,1).tableau
    a(cellfun('isempty',a)) = {NaN}; %il se peux qu'il y ai des cases vides
        b = cellfun(@isnan, a);
        idx = find(b(:,1));
        for i = 2:size(a, 2)
            idx = union(idx, find(b(:,i)));
        end
        a(idx, :) = [];
    j'obtiens mon tableau avec les lignes des Nan enlevés, mais pour les autres tableaux comment je peux supprimer aussi les lignes?

    Merci de votre aide, je commence à saturer un peu

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    j'aurais fait ça comme ça :

    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
    a =infrastructure.capteur(1,1).tableau
     
    b=isnan(a);
     
    [x,y]=find(b==1)
     
    x=unique(x);% tri et supprime les doublon
     
    for i=1:length(x)
     
    for k=1: nbcapteur %boucle sur tous tes tableaux
    a =infrastructure.capteur(k).tableau
    a=cat(2,a(1:x(i)-1,:),a(x(i)+1:end,:));% j'ai fait le cat a l'arrache verifie bien le sens 
     
    end
    x=x-1;%(suppresion d'une ligne on decremente tous les autres indices)
    end

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    merci beaucoup pour l'aide
    je comprend pas trop l'utilisation du cat là? au final je peux pas supprimer ma ligne en faisant un
    ?

    Merquii

  4. #4
    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 : 53 160
    Points
    53 160
    Par défaut
    Si j'ai bien compris tes explications :

    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
    infrastructure.capteur(1,1).tableau{1,1} = [1 2 3];
    infrastructure.capteur(1,1).tableau{2,1} = [4 5 6];
    infrastructure.capteur(1,1).tableau{3,1} = [7 NaN 8];
    infrastructure.capteur(1,1).tableau{4,1} = [];
    infrastructure.capteur(1,1).tableau{5,1} = [NaN 9 10];
    infrastructure.capteur(1,1).tableau{6,1} = [11 12 13];
     
    infrastructure.capteur(2,1).tableau = infrastructure.capteur(1,1).tableau;
    infrastructure.capteur(3,1).tableau = infrastructure.capteur(1,1).tableau;
     
    idx = cellfun(@isempty, infrastructure.capteur(1,1).tableau) | cellfun(@(x) any(isnan(x)), infrastructure.capteur(1,1).tableau);
     
    infrastructure.capteur(1,1).tableau(idx) = [];
    infrastructure.capteur(2,1).tableau(idx) = [];
    infrastructure.capteur(3,1).tableau(idx) = [];
    C'est ça ?

    Le test peut aussi s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx = cellfun(@(x) isempty(x) || any(isnan(x)) , infrastructure.capteur(1,1).tableau)
    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)

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    Pas tout à fait

    quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nfrastructure.capteur(1,1).tableau(idx) = [];
    j'obtiens un tableau de 1 par 4455 valeurs??

  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 : 53 160
    Points
    53 160
    Par défaut
    Que contient exactement infrastructure.capteur(1,1).tableau ?
    Mon exemple ne correspond donc pas ?

    Que renvoie ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class(infrastructure.capteur(1,1).tableau)
     
    size(infrastructure.capteur(1,1).tableau)
    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
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ans =
     
    cell
     
     
    ans =
     
               1        4473

  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 : 53 160
    Points
    53 160
    Par défaut
    Citation Envoyé par Sasuke1234 Voir le message
    j'obtiens un tableau de 1 par 4455 valeurs??
    Le code a donc supprimé 18 cellules (vides ou contenant au moins un NaN) dans infrastructure.capteur(1,1).tableau

    Je ne vois pas où se situe le problème.
    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
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    Alors je me suis mal fais comprend

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        size(infra.capteur(1,1).tableau)
    a=infra.capteur(1,1).tableau;
        size(infra.capteur(1,1).tableau)
    idx = cellfun(@isempty, a) | cellfun(@(x) any(isnan(x)), a);
    infra.capteur(1,1).tableau(idx)=[];
        size(infra.capteur(1,1).tableau)
    mon tableau au début est de 1152 ligne par 4 et la à la fin il est de 1 ligne par 4473
    Moi je veux qu'il soit de 1080 par 4 si il y a 72 nan à une ligne différent dans mon tableau

    Tu voit à peu près?

    EDIT: dans tone exemple ca marche, pas dans le miens WTF

  10. #10
    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 : 53 160
    Points
    53 160
    Par défaut
    Comme ceci alors ?

    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
    infrastructure.capteur(1,1).tableau = {1 2 3};
    infrastructure.capteur(1,1).tableau(2,:) = {4 5 6};
    infrastructure.capteur(1,1).tableau(3,:) = {7 NaN 8};
    infrastructure.capteur(1,1).tableau(4,:) = {[] 9 10};
    infrastructure.capteur(1,1).tableau(5,:) = {NaN 11 12};
    infrastructure.capteur(1,1).tableau(6,:) = {13 14 15};
     
    infrastructure.capteur(1,1).tableau
     
    infrastructure.capteur(2,1).tableau = infrastructure.capteur(1,1).tableau;
    infrastructure.capteur(3,1).tableau = infrastructure.capteur(1,1).tableau;
     
    idx = cellfun(@(x) isempty(x) || any(isnan(x)) , infrastructure.capteur(1,1).tableau);
    idx = any(idx,2);
     
    infrastructure.capteur(1,1).tableau(idx,:) = [];
    infrastructure.capteur(2,1).tableau(idx,:) = [];
    infrastructure.capteur(3,1).tableau(idx,:) = [];
    Ce qui donne :
    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
    ans = 
     
        [  1]    [  2]    [ 3]
        [  4]    [  5]    [ 6]
        [  7]    [NaN]    [ 8]
           []    [  9]    [10]
        [NaN]    [ 11]    [12]
        [ 13]    [ 14]    [15]
     
     
    ans = 
     
        [ 1]    [ 2]    [ 3]
        [ 4]    [ 5]    [ 6]
        [13]    [14]    [15]
    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)

  11. #11
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    cool ca marche, maintenant au lieu de s'intérésser au Nan que du 1er tableau, je voudrais regarder les nan dans tout les tableaux, et suprrimer les lignes dans chaques tableaux,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for n=1:8
    tab= infra.capteur(n,1).tableau;
    idx = cellfun(@isempty, tab) | cellfun(@(x) any(isnan(x)),tab);
    idx = any(idx,2);
     
        for i=1:length(nombreCapteur)
        infra.capteur(i,1).data.tabCQ(idx,:) = [];
        end
     
    end
    je fais juste ca 8 fois pour chaque tableau, et la j'obtiens une erreur:
    Matrix index is out of range for deletion.
    alors que si je fais la boucle à la main
    tab= infra.capteur(1,1).tableau; puis tab= infra.capteur(2,1).tableau;...ainsi de suite j'obtiens pas d'erreur??!

Discussions similaires

  1. [XL-2007] Relevé dans une colonne la prochaine ligne vide.
    Par toniob44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/08/2012, 19h12
  2. Recherche Valeur -> écrire dans une colonne de cette ligne
    Par Xiombarg2911 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/04/2008, 15h12
  3. [Tableaux] calcul de lignes dans une colonne
    Par carmen256 dans le forum Langage
    Réponses: 6
    Dernier message: 24/07/2007, 20h31
  4. Nombre de lignes <> '' dans une colonne Excel
    Par zemeilleurofgreg dans le forum Delphi
    Réponses: 5
    Dernier message: 10/07/2007, 16h22
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 22h56

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