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 :

Insérer une ligne de "NaN" au travers d'une boucle


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Insérer une ligne de "NaN" au travers d'une boucle
    Bonjour,

    Étant tout nouveau sur le forum, il s'agit de mon premier post donc si certaines choses ne vont pas n'hésitez pas à me le dire.

    Mon problème est le suivant: je travaille sur des données de hauteurs d'eau avec une variable "hauteur_eau" et une variable "diff_time" correspondant à la différence entre une date (t) et une date (t+1). Cette différence me permet de vérifier que l'intervalle de temps est continu mais bien évidemment ce n'est pas le cas et certaines discontinuités de plusieurs heures (voire plusieurs jours) sont présentes.

    Depuis 2 jours, je tente de créer une routine me permettant d'insérer un NaN avant chaque discontinuité. Travaillant sur un jeu de donnée de 50 000 valeurs, le but est d'automatiser cette insertion en utilisant un indice repérant les discontinuités temporelles. Voilà où j'en suis, car je tourne un peu en rond.. pour faciliter les tests, j'ai reproduit un jeu de donnée à 7 valeurs.

    Ci-dessous mon script, en espérant avoir été assez clair et que quelqu'un pourra m'aider.

    Cordialement,

    Sylvain

    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
    diff_time = [0.0208;0.0208;0.0500;0.0208;0.0800;0.0400;0.0208];
    hauteur_eau = [1.5;1.2;3.0;3.8;0.4;0.7;0.8];
     
    % Création de l'indice repérant la discontinuité dans l'échelle temporelle.
    indice_time = find(diff_time~=0.0208);
    heau_filtree = hauteur_eau(indice_time);
     
    % Boucle d'insertion des "NaN" dans la variables hauteur_eau, avant et
    % après les valeurs des discontinuités temporelles correspondantes:
     
    i=1;
    for t=1:1:length(hauteur_eau)
        if t == indice_time(i);
        hauteur_eau(t) = [hauteur_eau(indice_time(i)-1);NaN;hauteur_eau(indice_time(i),1)];
        i=i+1;
        end
    end
    Error: In an assignment  A(I) = B, the number of elements in B and I must be the same.
    Le but étant d'obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    %     diff_time       hauteur_eau
    %     0.0208          1.5
    %     0.0208          1.2 
    %     NaN             NaN
    %     0.0500          3.0
    %     0.0208          3.8
    %     NaN             NaN
    %     0.0800          0.4
    %     NaN             NaN
    %     0.0400          0.7
    %     0.0208          0.8

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

    Cette erreur est due au fait que hauteur_eau(t) ne représente qu'une seule valeur tandis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [hauteur_eau(indice_time(i)-1);NaN;hauteur_eau(indice_time(i),1)]
    en représente trois. On ne peut pas mettre 3 valeurs à la place d'une seule.

    Une solution :
    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
    diff_time = [0.0208;0.0208;0.0500;0.0208;0.0800;0.0400;0.0208];
    hauteur_eau = [1.5;1.2;3.0;3.8;0.4;0.7;0.8];
     
    indice_time = find(diff_time~=0.0208);
     
    nbNaN = length(indice_time);
    hauteur = zeros(length(hauteur_eau)+nbNaN,1);
    temps = zeros(length(hauteur_eau)+nbNaN,1);
     
    hauteur(indice_time+(0:nbNaN-1).') = NaN;
    temps(indice_time+(0:nbNaN-1).') = NaN;
     
    notNaN = ~isnan(hauteur);
    hauteur(notNaN) = hauteur_eau;
    temps(notNaN) = diff_time;
    [temps hauteur]
    Attention toutefois à ce genre de comparaison diff_time~=0.0208 incluant des nombres flottants.
    Pourquoi 0.3-0.2-0.1 est-il différent de 0 ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Parfait, c'est exactement ce que je cherchais à faire et ça me permet d'avoir un jeu de données propre pour la réalisation de mes graphes.

    Code très astucieux et beaucoup plus simple que la boucle que je tentais de faire. Merci beaucoup pour ton aide.

    Sylvain

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

Discussions similaires

  1. bgColor d'une ligne s'il existe déjà un bgColor sur une cellule
    Par PoichOU dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 15/06/2007, 11h34
  2. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08

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