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 des lignes dans une matrice


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Points : 96
    Points
    96
    Par défaut Supprimer des lignes dans une matrice
    salut,

    Alors voilà.
    Je possède des matrices avec de très nombreuses lignes, et 8 colonnes.
    Dans cette matrice, j'ai des valeurs manquantes, nan.
    Pour mes calculs (régression et corrélation), je souhaite oter ces nan.
    Je veux donc créer un programme qui rechercherait les lignes où j'ai un nan, et qu'il me supprime la ligne, et ainsi de suite.
    Le problème, c'est que parfois il n'y a qu'un nan sur la ligne (genre il est à la 8ème colonne) et du coup, il faut que je supprime toute la ligne...

    Voilà ce que j'ai commencé à écrire, mais ça ne marche pas....

    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
    % retire les lignes avec coord nan
    clear all
    close all
    load X2
     
    [n,p]=size(X2)
     
    for i=1:p
        clear f
        f=find(isnan(X2(:,p))==0);
        if f==0;
            X2(:,:)=[];
        elseif X2(:,:);
        end
    end
    Merci, j'ai passé un grand bout de ma soirée dessus, et j'ai pas trouvé....

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Déjà il y a une erreur dans ton code :vide toute ta matrice !!
    Et en plus tu parcours les colonnes.
    Pourtant dans le texte tu dis que tu veux supprimer les lignes

    Une solution qui supprime les lignes dans X2 dès qu'il y a au moins 1 NaN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %on parcours toutes les lignes de X2 depuis le "bas"
    for i=n:-1:1
       if any(isnan(X2(i,:)) %il y a au moins un NaN dans la ligne i de X2
          %=> on la supprime
          X2(i,:)=[];
       end
    end
    PS : je n'ai pas testé, pas le temps de lancer MATLAB...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Points : 96
    Points
    96
    Par défaut
    Ok merci, je vais tester.

    en fait je pensais que
    me vidait la ligne avec toutes les colonnes de l'endroit où j'avais mon nan...

    Donc je vais voir si ca marche et je te tiens au courant.
    Merci de ton aide

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Points : 96
    Points
    96
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    %30 Janvier 2008
    %
    %On retire les lignes avec les valeurs nan
     
    X=fichier;
     
    function Y=isnan(X)
     
    [n,p]=size(X);
    %on parcours toutes les lignes de X depuis le "bas"
     
    tt = 'Progress [  0%% ]';
    h = waitbar(0,tt);
    fprintf(tt);
     
    fin=???
     
    for i=n:-1:1
       fprintf('\b\b\b\b\b\b%2.0f%% ]\n', 100*i/fin);
       if any(isnan(X(i,:))) %il y a au moins un NaN dans la ligne i de X
          %=> on la supprime
          X(i,:)=[];
       end
        waitbar(i/fin,h,sprintf('Progress [  %2.0f%% ] \n', 100*i/fin));
        pause(0.1);
    end
    Alors voilà ma fonction qui fonctionne bien merci.

    Par contre j'ai voulu intégrer une barre de progression, mais j'ai un petit soucis, ptètre tout bête, c'est que je ne sais pas comment définir fin, ce qui fait que du coup cela ne fonctionne pas.....

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    On peux eviter la boucle, je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    l=any(isnan(X2),2)
    X2(l,:)=[]

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Points : 96
    Points
    96
    Par défaut
    Je vais essayer sans la boucle,
    Mais est-ce que quelqu'un a une idée pour la progression?

  7. #7
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Comme i va de n à 1 il faut changer le pas pour prendre ça en compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin=n;%tout simplement ;-) donc inutile....
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=n:-1:1
       %blabla
       pas = (n-i+1)/n;
       waitbar(pas,h,sprintf('Progress [  %2.0f%% ] \n', pas*100));
    end
    Et sinon effectivement la solution de vinc-mai est la plus jolie

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 202
    Points : 96
    Points
    96
    Par défaut
    Merci, vous êtes géniaux


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

Discussions similaires

  1. supprimer des lignes dans une table SAS
    Par yoyo44ima dans le forum SAS Base
    Réponses: 7
    Dernier message: 25/05/2011, 09h39
  2. Supprimer des lignes dans une feuille Excel
    Par thefutureisnow dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/04/2011, 13h48
  3. Supprimer des lignes dans une table
    Par ToniConti dans le forum Pentaho
    Réponses: 5
    Dernier message: 03/08/2010, 23h09
  4. Insérer des lignes dans une matrice
    Par you_go dans le forum Fortran
    Réponses: 2
    Dernier message: 21/08/2009, 12h10
  5. [VBA] Supprimer des lignes dans une table
    Par shadockgreg dans le forum Access
    Réponses: 6
    Dernier message: 22/11/2006, 09h58

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