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 :

Matlab: petite question sur while [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 84
    Points : 41
    Points
    41
    Par défaut Matlab: petite question sur while
    Bonjour,


    J'aimerais créer une simple boucle while pour compter le nombre de cellules non vides. Voici le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    n=3;
    while (isempty(E{1,n-1}{1,p}) ~=1 )
    n=n+1;
    end
    Comme vous voyez, tant que la cellule est non vide, n est incrémenté d'un
    Le problème étant qu'à la fin, il y aura E{1,end+1} qui n'existe pas, et le message d'erreur "??? Index exceeds matrix dimensions." s'affichera.

    Que faut il faire?

    Merci,

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 319
    Points : 843
    Points
    843
    Par défaut
    Bonjour socrate88,

    Il te faut faire une condition supplémentaire dans le while qui te vérifie que "n" ne dépasse pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( (n < size(E, 2)) && (isempty(E{1,n-1}{1,p}) ~=1 ))
        n=n+1;
    end
    A noter que mettre la condition avant le test "isempty" permet de sortir de la boucle dès que "n" dépasse, alors que si elle était mise après, l'erreur se produirait puisque la première condition est d'abord testé ...

    Mais à ce stade, si tu connais la taille de "E", peut-être qu'une boucle "for" te sera plus approprié, d'autant plus que "while" s'arrêtera à la première cellule non vide, même s'il y en a d'autres ensuite qui sont vides.


    PS : peut-être que
    pourrait te simplifier la tâche, mais je ne suis pas familier avec les cellules ...
    "Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse, vampirella.
    C'est en effet ce que j'ai essayé, mais le problème justement, c'est que la longueur de lignes de E est variable.
    En fait je dois rechercher des données aberrantes, de valeur -999, identifier la date de la mesure et toutes les données aberrantes à cette date. Et comme le nombre de données aberrantes n'est pas toujours le même pour des dates différentes.

    Par contre, ce que j'ai fais par la suite, c'est d'intervertir les lignes et les colonnes, ce qui fait que j'ai pu utiliser end comme fin d'une colonne, ce qui donne la taille en question.

    Maintenant le problème devient plus 'banal': fprintf ne prend pas les cellules
    ??? Error using ==> fprintf
    Function is not defined for 'cell' inputs.

    Error in ==> fino1 at 103
    fprintf(fid,'%s', E{1,p}(p2));
    j'ai beau essayé je n'arrive pas à les convertir...

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 319
    Points : 843
    Points
    843
    Par défaut
    Bonjour,

    Essaye de convertir avec "cell2mat", ça devrait marcher.
    "Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    ça marche. En fait j'avais un problème de cellules dans cellules, de façon un peu désordonnée.
    du coup j'ai fais un IF pour bien séparer ces lignes, et cell2mat marche.

    Merci vampirella.

    Tant qu'on y est, si ça ne t'ennuit pas encore une question
    j'aimerais donner un effet visuel sur les données incohérentes, dont la valeur est -999. Pour cela j'aimerais créer une barre rectangulaire qui représente une ligne de données: une donnée correcte devrait colorier le segment [x(i),x(i+1] en vert, et une -999 devrait le colorier en rouge.

    j'ai voulue utiliser AREA. Mais je ne sais pas si AREA permet de faire des graphs segment par segment,

    Merci,

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 319
    Points : 843
    Points
    843
    Par défaut
    Malheureusement non, il te faudra déterminer toi-même tes segments.

    Je te conseille de travailler avec :
    En effet, "bar" te permettra de simplifier vraiment les choses, même si "area" te produira sans doute un rendu un peu plus joli.

    Voici un exemple d'application de "find" et de "bar" pour ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    x = [1 2 3 4 5 6 7 8 9];
    y = ones(1, length(x));
    data = [1 2 -999 -999 5 6 7 -999 9];
    corrupt_data = find(data == -999);
    figure;
    bar(x,y,1,'g');
    hold on;
    bar(x(corrupt_data),y(corrupt_data),1,'r');
    "Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    ça marche à merveille !

    Merci pour tout!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2006, 12h09
  2. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  3. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  4. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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