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 :

[cell] Gestion de tableaux - Suppression de lignes


Sujet :

MATLAB

  1. #1
    Invité
    Invité(e)
    Par défaut [cell] Gestion de tableaux - Suppression de lignes
    Bonjour à tous !

    Appel au secours : après avoir retourné le problème dans tous les sens, je ne trouve définitivement pas la solution.
    Il s'agit de gestion de tableau : j'ai plusieurs vecteurs (variables{1},variables{2},variables{3}) regroupés dans un tableau appelé "variables". Ces vecteurs sont de même taille.
    Concrètement, je voudrais que lorsqu'une ligne d'un de ces vecteur n'est pas un nombre, cette ligne soit supprimée dans tous les autres vecteurs.

    Voici le code, suivi de l'explication ligne à ligne de ce que j'ai 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    % DELETION OF INVALID VALUES
     
    function [variables] = deletion(variables)
     
    varclear = variables;
     
    for i = 1:length(variables)
        j = 1;
        l = 1;
        while j<length(variables{1})+1 && l<length(varclear{1})+1
            if isnan(variables{i}(j)) == 1
                for k = 1:length(variables)
                    varclear{k}(l) = [];
                end
            else
                l = l+1;
            end
            j = j+1;
        end
    end
    variables = varclear;
     
    disp(' ')
    disp([num2str(length(variables{1})) ' values considered.'])
    Explication :

    l.3 : la fonction s'appelle "deletion". Elle prend en entrée "variables". En sortie, on obtient d'autres valeurs de "variables"
    (NB : le fait que l'input et l'output de "deletion" aient le même nom ne semble pas avoir d'influence)

    l.5 : introduction d'une variable temporaire "varclear", identique à "variables"

    l.7 : on parcourt l'ensemble des variables (variables{1}, variables{2}, variables{3})
    l.10 : et on définit une variable j (resp l) associée à la longueur des "variables" originales (resp "varclear")

    l.11 : si la cellule étudiée au sein de la "variables" étudiée n'est pas un nombre
    l.12 & 13 : alors on supprime cette cellule (indice l) pour toutes les "varclear" (indice k)
    (NB : "variables" reste inchangé)
    (NB2 : dans ce cas, la prochaine cellule de la "varclear" à étudier a toujours pour indice l puisque l'ancienne cellule indicée l a été supprimée)

    l.15 : si la cellule étudiée au sein de la "variables" étudiée est un nombre
    l.16 : alors la prochaine cellule de la "varclear" a étudier aura pour indice l+1

    l.18 : dans tous les cas, la prochaine cellule de la "variables" a étudier aura pour indice j+1

    l.21 : "variables" est redéfinie comme "varclear"


    Concrètemement, toutes les valeurs NaN sont bien supprimées des vecteurs de "variables", mais d'autres valeurs chiffrées le sont également, ce qui me fait perdre beaucoup de données . . .
    Une idée du pourquoi ça ne fonctionne pas ????

    Merci à vous !
    Dernière modification par Invité ; 14/10/2011 à 10h30.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ton problème vient de l'emplacement de ta boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k = 1:length(variables)
        varclear{k}(l) = [];
    end
    par rapport à ton if isnan(variables{i}(j)) == 1.
    Tu souhaites (je pense) seulement supprimer la case {i}(j) et non tous les emplacements l de chaque vecteur.

    Je te conseille avant de continuer de regarder ce message
    La fonction CELLFUN et l'indexage logique peuvent aussi être très utiles.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut Winjerome,

    J'avoue que ce n'est pas la première fois qu'on me parle de l'indexage logique, mais je n'y comprends pas grand choses à vrai dire. Je comprends bien ce qui est expliqué sur la page, mais je ne vois pas comment mettre ça en pratique ... Ici par exemple, je n'utilise pas de "find". Il est vrai que je pourrais rechercher tous les NaN puis les supprimer, mais comment chercher un NaN par indexage logique ??

    En ce qui concerne le message, très utile en effet. Je ne savais pas du tout qu'il était possible de faire une boucle décroissante. Je vais m'en inspirer.

    Quant à ma boucle, je souhaite supprimer tous les emplacements (j) dans tous les vecteurs. Comme au début j vaut l, cela revient bien à supprimer "tous les emplacements l de chaque vecteur". Par la suite, j diffère de l parce que comme expliqué dans le message vers lequel tu me renvoies, la taille de "varclear" change au fur et à mesure : après plusieures boucles, la ligne j de "variables" correspond toujours à la ligne l de "varclear", mais j et l n'ont plus la même valeur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Après étude plus approfondie de ton code, le problème vient du fait qu'il ne tient pas compte du fait qu'il peut y avoir plusieurs NaN sur une "ligne de vecteurs". Il en résulte la suppression d'autant de lignes que de vecteurs contenant de NaN à cette ligne au lieu d'une seule.
    La solution est alors de faire la suppression directement dans variables et de ne pas utiliser varclear.
    Ton code devient alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i = 1:length(variables)
        j = 1;
        while j<=length(variables{1})
            if isnan(variables{i}(j))
                for k = 1:length(variables)
                    variables{k}(j) = [];
                end
            else
            j = j+1;            
            end
        end
    end
    Sinon tes vecteurs étant de même longueur, tu as la possibilité de les stocker dans une simple matrice au lieu d'utiliser un tableau de cellules.
    Ainsi pour faire ce que tu veux avec l'indexage logique: (vecteurs par colonnes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    variables = [ 1   2  NaN 4  5;
                  6   7  8   9  10;
                  NaN 12 13  14 NaN;
                  16  17 18  19 20];
    variables(~any(isnan(variables),2),:)
    PS: N'hésites pas à parcourir le forum, les exemples sur l'indexage logique ne manquent pas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Après étude plus approfondie de ton code, le problème vient du fait qu'il ne tient pas compte du fait qu'il peut y avoir plusieurs NaN sur une "ligne de vecteurs". Il en résulte la suppression d'autant de lignes que de vecteurs contenant de NaN à cette ligne au lieu d'une seule.
    Ah oui, effectivement !! Je regarde la solution que tu proposes au plus vite, et je te tiens au courant. Je pense que ça marchera de toutes façons. Merci !!

    Citation Envoyé par Winjerome Voir le message
    Sinon tes vecteurs étant de même longueur, tu as la possibilité de les stocker dans une simple matrice au lieu d'utiliser un tableau de cellules.
    Ainsi pour faire ce que tu veux avec l'indexage logique
    Je comprends bien l'intérêt de l'indexage logique pour le coup. Je creuse l'idée. Merci encore ;)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Alors, effectivement la correction que tu as apporté à mon prgramme marche très bien. Merci encore.
    (Quelle idée aussi de passer par une variable temporaire quand c'est inutile ... J'vous jure, ces automatismes ...)

    Quand à l'idée d'écrire "variables" sous forme matricielle, j'ai retrouvé la raison pour laquelle je ne l'ai pas fait dès le début : j'utilise une fonction qui me permet de choisir les variables à utiliser. J'écris "variables" sous forme de tableau, tel que variables = {param{1} param{2} param{3}}, parce que param{i} doit nécessairement être une cellule puisqu'il s'agit d'un vecteur dont le nom est entré par l'utilisateur.
    Pas sûr que tout ça soit bien clair, expliqué comme ça ... Mais bon, ce que je veux dire, c'est que le passage par une fonction intermédiaire de sélection (par l'utilisateur) des variables à prendre en compte dans "variables" ne me permet pas d'écrire "variables" directement, et m'oblige à passer par un tableau ... Voilà !
    Merci quand même, la remarque était enrichissante :)

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

Discussions similaires

  1. [XL-2003] Ajout et suppression de lignes dans 2 tableaux simultanéments
    Par olivier777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/09/2012, 13h29
  2. tableaux dynamique avec ajout et suppression de lignes
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/06/2008, 17h01
  3. [Tableaux] Suppression de lignes dans un tableau
    Par lodan dans le forum Langage
    Réponses: 9
    Dernier message: 15/09/2006, 20h08
  4. Réponses: 4
    Dernier message: 02/07/2004, 19h14
  5. [VB.NET] Suppression de ligne dans un DataTable
    Par seemax dans le forum Windows Forms
    Réponses: 7
    Dernier message: 06/05/2004, 14h19

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