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 :

Double indexage logique


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    Par défaut Double indexage logique
    Bonjour, imaginons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    temps = [1 1 2 2 3 3 3 4 4] %(en jour)
    data= [741 nan 458 42 48 78 nan 85 95]
    J'aimerais faire la somme des éléments de data du même jour, ie me retouver avec une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sum_data_jour = [741 458+42 48+78 85+95]
    donc j'utilise UNIQUE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temps_uni = unique(temps)
    
    for i_uni = 1:length(temps_uni)
    data(i_uni) = sum(data(temps==temps_uni(i_uni)));
    end
    le problème étant que la SUM des éléments d'un matrice contenant un NaN est toujours égale à NaN...pas terrible.

    Je pourrais sûr rajouter cette commande avant pour transformer mes NaN en 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data(isnan(data))=0;
    Mais n'y a t il pas un moyen de faire un double indexage logique au lieu de tout ça? un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data(i_uni) = sum(data(data==temps_uni(i_uni) & isnan(data)=0));

    Merci

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    C'est presque çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data(i_uni) = sum(data(data==temps_uni(i_uni) & ~isnan(data)));
    Ou en une seule ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    arrayfun(@(x) (sum(data(data==x & ~isnan(data)))), unique(temps));
    Enfin faut tester...

  3. #3
    Membre éprouvé
    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
    Par défaut
    je vais essayer merci !

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = ~isnan(data);
    data = full(sparse(temps(idx),1,data(idx)));
    Il est souvent inutile d'utiliser FULL pour revenir à une matrice pleine...

  5. #5
    Membre éprouvé
    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
    Par défaut
    Citation Envoyé par Dut Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = ~isnan(data);
    data = full(sparse(temps(idx),1,data(idx)));
    Il est souvent inutile d'utiliser FULL pour revenir à une matrice pleine...
    utile?

    Et effectivement, cette petite ligne me simplifie bien la vie !

    merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Citation Envoyé par Newenda Voir le message
    utile?
    j'ai bien dit "inutile"...

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

Discussions similaires

  1. double indexage logique
    Par Newenda dans le forum MATLAB
    Réponses: 2
    Dernier message: 15/07/2009, 10h14
  2. [Débutant] Question sur l'indexage logique
    Par PaM... dans le forum MATLAB
    Réponses: 3
    Dernier message: 21/01/2009, 12h38
  3. Petite question sur l'indexage logique
    Par pedrosanchau dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/12/2007, 09h29
  4. Indexage logique pour plusieurs valeurs
    Par Gui13 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2007, 10h23
  5. Indexage logique pour plusieurs valeurs
    Par Dam2227 dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/06/2007, 14h48

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