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 :

Remplir matrice de 0 sous condition d'un vecteur.


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut Remplir matrice de 0 sous condition d'un vecteur.
    Bonjour

    Alors voilà,n je sollicite votre aide pour un petit problème que je vais essayé de simplifier :

    J'ai une matrice DATA de valeurs, disons que chaque colonne de la matrice correspond a plusieurs valeurs d'un jour (vecteur Jour).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Jour = 1        2         3          5         9
    DATA = 5        8          4          7        5
          1        4          7          5        5
          7        8          4          4        6
    Bon j'essaye de ploter ça avec PCOLOR seulement il me garde la même valeur entre le jour 3 et le jour 5, c'est à dire qu'il me met la valeur du jour 3 dans jour 4 alors que là justement il n'y a pas de valeur.

    Donc voici ma question, comment faire pour refaire une matrice DATA de valeur ou il y aura des 0 dans les colonnes ou les jours n'existeront pas.

    Déjà recréer le vecteur jour afin d'avoir un vecteur avec TOUS les jours, même ceux n'ayant pas de mesure, par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jour_tous = jour(1):jour(end)
    Mais ensuite je bloque pour recréer une matrice DATA avec des colonnes de 0 là où les jours ont été ajoutés. Peut etre en créant une matrice DATA de 0 de la bonne dimension et ajouter les valeurs là où il faut mais j'ai besoin d'aide là.

    Merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #2
    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 : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Mais ensuite je bloque pour recréer une matrice DATA avec des colonnes de 0 là où les jours ont été ajoutés.
    Simplement comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Jour = [1        2         3          5         9]
     
    DATA = [5        8          4          7        5
            1        4          7          5        5
            7        8          4          4        6]
     
     
    A(:,Jour) = DATA
    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)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Prends les numéros des jours comme des indices de colonnes c'est à dire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for a=1:max(jour)
        if jour(a)~=a
            DATA(:,a)=zeros(nb_line,nb_col)
        end
    end
    C'est l'idée que tu dois voir... lol

    Christophe

    PS : trop rapide Dut...
    INCIA : MATLAB R2014a sous MAC OS 10.9.3

    Nous piétinerons éternellement aux frontières de l'Inconnu, cherchant à comprendre ce qui restera toujours incompréhensible. Et c'est précisément cela qui fait des nous des hommes. Isaac Asimov

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par Dut Voir le message
    Simplement comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Jour = [1        2         3          5         9]
     
    DATA = [5        8          4          7        5
            1        4          7          5        5
            7        8          4          4        6]
     
     
    A(:,Jour) = DATA
    Merci bien mais c'est là qu'on remarque que trop simplifier le problème n'est pas toujours opportun... En réalité mes jours ne sont pas 1,2,3 etc.. mais plutôt sous cette forme (AnsMoisJour):
    20090201
    20090202
    20090203
    20090205
    20090209

    Donc là il va chercher une matrice à plus de 20 millions de valeurs...

    Je peux aussi avoir du temps en Heure, voire en minute mais toujours sous cette forme ou le pas de temps correspondra à +1
    (exemple en heure :
    2009020100
    2009020104
    2009020106
    2009020203
    2009020209)

    Citation Envoyé par christophe_halgand Voir le message
    Prends les numéros des jours comme des indices de colonnes c'est à dire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for a=1:max(jour)
        if jour(a)~=a
            DATA(:,a)=zeros(nb_line,nb_col)
        end
    end
    C'est l'idée que tu dois voir... lol

    Christophe

    PS : trop rapide Dut...
    Je vais étudier ça, mais j'aimerais éviter les boucles autant que faire ce peut.

    En tout cas merci à vous.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  5. #5
    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 : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Newenda Voir le message
    En réalité mes jours ne sont pas 1,2,3 etc.. mais plutôt sous cette forme (AnsMoisJour):
    20090201
    20090202
    20090203
    20090205
    20090209

    Donc là il va chercher une matrice à plus de 20 millions de valeurs...
    Tu te rappelles de la fonction DATENUM ? Mais si, tu t'en rappelles !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    D = ['20090201'
         '20090202'
         '20090203'
         '20090205'
         '20090209']
     
    Jour = datenum(D,'yyyymmdd');
     
    Jour = Jour-Jour(1)+1
    Encore une fois, c'est l'idée... à toi de l'adapter à ton 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)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par Dut Voir le message

    Jour = datenum(D,'yyyymmdd');
    Oui ça e le fais juste après, car je plot en temps réel donc j'ai besoin de ce temps matlab.

    Citation Envoyé par Dut Voir le message
    Jour = Jour-Jour(1)+1[/CODE]
    Oui tient pas con ça !

    Mais en faite je me prends la tête parce qu'à la base, j'ai fait un méthode de calcul de moyennage de mes valeurs en fonction du temps peu orthodoxe:

    ******************************************************

    En effet, mes données brutes sont de cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    temps               bf1    bf2     bf3     bf4     bf5
    733581.93072453700 ; 5     8     6     4     5 
    733581.93087268516 ; 4     7     5     6    4
    733581.93132986105 ; 4     7     5     6     1
    [...]
    Avec en 1ere colonne le temps et ensuite les différentes valeurs (correspond à la valeur d'un bande fréquentiel: bf). Moi je transforme le temps pour avoir une valeur identique par pas que je souhaite (Jour, Heure, Minute). Si je veux une moyenne par heure par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temps_pas = datestr(temps,'yyyymmddHH')
    temps_pas = str2num(temps_pas); % en valeur numérique
    
    (%% pour un pas de temps en minute il suffirait d'écrire:
    temps_pas = datestr(temps,'yyyymmddHHMM'))
    Ensuite j'utilise la fonction UNIQUE pour moyenner toutes les valeurs comprises dans une heure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    temps_heure_uni = unique(temps_pas) ;
     
     
    for i = 1:length(temps_heure_uni);
     
        bf1_heure(i) = mean(bf1(temps_pas==temps_heure_uni(i)));
        bf2_heure(i) = mean(bf2(temps_pas==temps_heure_uni(i)));
        bf3_heure(i) = mean(bf3(temps_pas==temps_heure_uni(i)));
        bf4_heure(ii) = mean(bf3(temps_pas==temps_heure_uni(i)));
        bf5_heure(i) = mean(bf3(temps_pas==temps_heure_uni(i)));
     
    end
    pour finir je rechange le format de mon temps pour le plottage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temps_heure_uni_matlab = datenum(num2str(temps_pas_uni),'yyyymmdd');
    et je plot


    ******************************************************

    Ce qui serait beaucoup plus simple c'est que je moyenne à TOUTES les heures directement et pas seulement à celles qui ont des valeurs comme ici.

    Peut etre est ce simple et cela résoudrait tout mon problème d'une manière beaucoup plus efficace et simple.

    Une sorte de boucle come cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = début_temps:1_heure:fin_temps
       moyenne_heure(i)=mean(data(temps>i & temps<i+1))
    end
    Merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Bon j'ai reprit l'idée de DUT, ça marche mais finalement je vais essayer de moyenner par pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    j=1 ;
    for i = début_temps : pas_temps : fin_temps
       moyenne_heure(j)=mean(data(temps>i & temps<i+1))
    j=j+1
    end
    ça marche apparemment et ça me met des NaN dans les pas de temps sans valeurs

    Merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

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

Discussions similaires

  1. [XL-2010] Remplir un tableau sous condition
    Par modus57 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/12/2013, 19h30
  2. Réponses: 11
    Dernier message: 29/10/2013, 12h10
  3. [WD17] remplir une colonne sous condition
    Par alex1005 dans le forum WinDev
    Réponses: 3
    Dernier message: 13/07/2012, 11h32
  4. Remplir automatiquement un champ sous condition.
    Par popoliline dans le forum Access
    Réponses: 15
    Dernier message: 15/09/2006, 23h04

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