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 :

sommation partitionnée d'une colonne [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut sommation partitionnée d'une colonne
    Bonjour à tous,

    Je devrais calculer le nombre de bonnes réponse selon le stimulus présenté.

    J'ai donc pour simplifier 2 colonnes : l'une (A) reprenant les bonnes ou mauvaises réponses (codées 1 ou 0) et une autre (B) correspondant au stimuli présenté. Cette colonne est un peu plus complexe car elle ne varie pas de 1 à nom nombre de présentation mais elle comprend des répétition du même chiffre (car présentation plusieurs fois du même stimulus). En effet, cette colonne est donc 4, 4, 4, 5, 5, 5, 6, 6,...

    Le but serait donc de dire à Matlab : Pour le chiffre 4, tu comptes les bonnes réponses dans la colonne A, puis tu fais le chiffre 5, jusqu'à la fin. De ce fait, je voudrai faire une sommation partitionnée de la colonne A selon le type de stimulus considéré dans la colonne B.

    Voici à quoi j'ai pensé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    rep_corr = [];    
        for ii = 4:size(B);    
            rep_corr = sum(A)      
        end
    Je suis conscient des lacunes de ce code car lorsque je dis 4:size(B) Matlab risque de prendre en considération toutes les lignes et pas uniquement tout les lignes avec le même nom. Mon problème est que je parviens pas à lui faire prendre en considération uniquement les chiffres identiques dans la colonne B. De plus lorsque je regarde rep_corr, je n'ai qu'une seule ligne alors que je devrais en avoir autant qu'il y a de stimuli présenté.

    Quelqu'un aurait un tuyau pour m'aider à avancer?
    Je vous remercie d'avance

    rq/ Matlab 7.5.0 (R2007B)

  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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Un exemple pour une valeur:
    Pour définir la liste des valeurs de B tu peux utiliser la fonction UNIQUE et ainsi construire ta boucle.

    Au passage je te conseille de lire ceci: FAQ: Indexage linéaire

    Bonne apm,
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    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 : 53 165
    Points
    53 165
    Par défaut
    C'est un travail pour la fonction HISTC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A = [rand(1,8)>.5 ; 4 4 4 5 5 5 6 6].'
     
    pA = prod(A,2);
    uA = unique(A(:,2));
     
    n = histc(pA,uA);
     
    [uA n]
    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)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut
    Ok, j'y vois un peu plus claire dans l'utilisation de la fonction UNIQUE. Vraiment impressionnant le raisonnement. J'étais en fait parti sur une décomposition de B par le nombre de stimuli en utilisant une boucle mais cela ne tournait toujours pas.

    Merci bcp en tout cas! Je vais voir ce que cela donne.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut
    Oui c'est bien cela, ça marche correctement.

    Cependant, ce raisonnement n'est valable que si une de mes deux colonnes est composée de 0 et de 1. Dans le cas où on aurait des temps de réaction (colonne C par exemple), y a-t-il quelques choses de plus simple que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TR4 = C(1)+C(2)+C(3);
    TR5 = C(4)+C(5)+C(6);
    TR6 = C(7)+C(8)+C(9);
    En gros, je dis que pour connaitre le temps de réaction pour le stimulus 4, il faut ajouter les lignes 1, 2 et 3 de ma colonne C. Ainsi de suite pour les autres stimuli.

    En tout cas, je vous remercie pour l'excellent tuyau d'au-dessus!

  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 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 : 53 165
    Points
    53 165
    Par défaut
    Alors il faut utiliser SPARSE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A = [rand(1,8) ; 4 4 4 5 5 5 6 6].'
     
    [a,b,c] = find(sparse(A(:,2),ones(size(A,1),1),A(:,1)));
     
    [a c]
    J'admet que ces solutions sont très MATLABiennes et pas vraiment très didactique pour des débutants... mais quand on a appris à se passer des boucles, c'est difficile de revenir en arrière.
    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)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut
    Merci pour ta réponse.

    Je parviens plus ou moins à comprendre la logique. Et c'est vrai que ça rend les choses plus courtes comparées aux boucles. Pour m'aider à comprendre, j'avais fait la décomposition du find en 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X = sparse(A(:,2)
    Y = ones(size(A,1),1),A(:,1))
    Cependant, cela ne m'aide pas à voir où se fait la sommation (quelle fonction l'induit) car a aucun moment on n'indique sum. Cela rend donc la formule difficile à utiliser si on s'intéresse à un écart-type ou une moyenne.

    Se sont des questions superflues mais c'est juste pour comprendre.
    Merci d'avance pour les éclaircissements.

  8. #8
    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 : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par gc001 Voir le message
    Cependant, cela ne m'aide pas à voir où se fait la sommation (quelle fonction l'induit) car a aucun moment on n'indique sum.
    C'est dans la construction de la matrice creuse avec SPARSE

    On peut lire dans la documentation de la fonction SPARSE :

    S = sparse(i,j,s,m,n,nzmax) uses vectors i, j, and s to generate an m-by-n sparse matrix such that S(i(k),j(k)) = s(k), with space allocated for nzmax nonzeros. Vectors i, j, and s are all the same length. Any elements of s that are zero are ignored, along with the corresponding values of i and j. Any elements of s that have duplicate values of i and j are added together.
    C'est très utile pour faire des assemblage de matrice en une seule fois
    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)

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut
    Oui effectivement! J'ai mal lu.

    Y a-t-il d'autres fonctions qui permettent de faire des soustraction, faire une moyenne ou un écart-type? Ou bien le raisonnement dois totalement changer si on veut faire de telles choses?

    Je voulais par ailleurs vous demander pourquoi lorsqu'on l'introduit la formule que vous avez proposé dans une boucle (je sais que vous n'aimez pas trop les boucles mais c'est la seule manière que j'ai de faire je pense), cela ne fonctionne pas. Il fait le calcul comme si le if n'existait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if res_sorted(:,4) == 1;
    [a,b,c] = find(sparse(matrix_RT(:,2),ones(size(matrix_RT,1),1),matrix_RT(:,1)));
    rep = [a c]
    end
    L'idée ici, est d'additionner uniquement les réponses correctes codée par un 1. Pour seulement ensuite faire la moyenne.

    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/06/2011, 12h56
  2. Faire la sommation d'une colonne de DBGrid
    Par lepeule dans le forum Débuter
    Réponses: 5
    Dernier message: 03/06/2010, 10h27
  3. Sommation d'une colonne
    Par lesanglier dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 22/10/2009, 16h09
  4. Sommation d'une colonne
    Par lesanglier dans le forum SharePoint
    Réponses: 0
    Dernier message: 02/10/2009, 14h15
  5. [PostGres] Suppresion d'une colonne.
    Par Gandalf24 dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/05/2003, 09h02

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