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 :

Moyenne sur les lignes d'une matrice en négligeant certaines valeurs


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut Moyenne sur les lignes d'une matrice en négligeant certaines valeurs
    bonjour
    voila j'ai une matrice 1024*1024 je voudrait prendre le mean de cette matrice mais sans prendre les Zeros qui sont a l'interieur
    et ensuite faire la soustraction que sur les nombres differents de zeros

    ex :

    0 0 12 15 18 0 0 0 ... me donne 15
    0 11 6 2 3 8 0 0 .. me donne 7
    0 0 0 0 3 6 0 0 me donne 4.5


    et ensuite

    0 0 -3 0 3 0 0 0 ..
    0 4 -1 -5 -4 1 0 0 ..
    0 0 0 0 -1.5 1.5 0 0...

  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 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
    Tu fais une boucle FOR-END qui scanne chaque ligne de ta matrice, tu utilises l'indexage logique pour trouver les valeurs non nulles sur chaque ligne et la fonction MEAN pour faire la moyenne

    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X = [0 0 12 15 18 0 0 0
    0 11 6 2 3 8 0 0
    0 0 0 0 3 6 0 0]
     
    bsxfun(@minus,X,sum(X,2)./sum(X~=0,2)).*(X~=0)

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    j'ai tente la premiere methode mais ensuite j'aimerai enlever ce que le mean a chaque chiffre pour les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:948
        x=resfinal5(:,i);
        if x~=0
           B=mean(x) 
        end
    end
    ensuite je voudrai que mean(x) de chaque ligne soit soustrait a chaque x de la meme ligne et recuper ensuite ma matrice avec mes zeros et x-mean(x)

  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
    Citation Envoyé par Dut Voir le message
    tu utilises l'indexage logique pour trouver les valeurs non nulles sur chaque ligne
    => : Qu'est-ce que l'indexage logique ?

  5. #5
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Avant de faire quoi que ce soit d'autre, revoit ton code : il est faux...
    Pour plein de raisons :
    • Tu boucles sur les colonnes et pas sur les lignes
    • x~=0 sera vrai ssi tous les éléments de x sont différent de 0
      • soit B est la moyenne de toute la colonne qui n'a pas de zéros
      • soit il y a un zéro et la moyenne n'est pas calculée
    Et fait un tour par la
    Qu'est-ce que l'indexage logique ?

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    alors j'ai regarder l'aide mais le probleme est que je n'y arrive pas
    a mon avis il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i=1:422
        for j=1:948
            x=resfinal(i,j);
            idx=find(x>0.1);
    mais je vois pas comment on fait pour appliquer mean(car il est ecrit que maintenant la matrice idx cest comme du binaire ) et le soustraire pour ensuite recuperer la matrice du debut avec les x differents de zeros changes

  7. #7
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Allez, puisqu'apparemment tu n'arrives pas à appréhender la faq (qui précise que l'indexage logique permet justement de ne pas utiliser FIND) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    X = [0 0 12 15 18 0 0 0
    0 11 6 2 3 8 0 0
    0 0 0 0 3 6 0 0]
    Xmean=zeros(size(X,1),1);%vecteur colonne qui a le même nombre de lignes que X
    %et qui va contenir les moyennes de chaque ligne
    %Boucle sur les lignes :
    for i=1:size(X,1)
       maLigne=X(i,:);%ième ligne
       Xmean(i)=mean(maLigne(maLigne~=0));%moyenne de maLigne pour maLigne~=0
    end
    Xmean %affichage

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    et si je fais cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i=1:422
        for j=1:948
            x=resfinal(i,j);
            if x~=0
               B=mean(x);
               C(i,1)=B ;
            end  
        end
    end
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i=1:422
        for j=1:948
            x=resfinal(i,j);
     
            if x~=0
                y=x-C(i,1);
                A=zeros(422,948);
                B=A+y;
            end
        end
    end

  9. #9
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    1. Je suppose que tu n'as pas vu mon post précédent.

    2. Essaye de comprendre pas à pas ce que tu fais.
    Dans ton premier code : pour i et j données x est juste une valeur.
    Si x est différent de 0 (par exemple 12 pour i=1 et j=3 dans l'exemple) tu as donc B qui est la moyenne d'une valeur (donc 12) => ça ne te choque pas ?

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    si en fait j'ai reflechi ensuite a ce que j'avais poste mais c'etait trop tard

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    merci
    ce qui m'interresser au debut c'etait en fait de recuperer la matrice X mais avec les element (differents de zeros) changes de x-mean(x)

    bon vais retenter un code mais ca foire car j'ai plus de zeros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i=1:422
        for j=1:948
            x=resfinal(i,j);
            y=resfinalmean(i,1);
            if x~=0
               M(i,j)=x-y;
            end 
        end
    end

  12. #12
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par momo032114 Voir le message
    bon vais retenter un code mais ca foire car j'ai plus de zeros
    Pourquoi tu n'as plus de zéros ? Où ça ?
    C'est quoi resfinal (ça n'est plus la matrice de départ), c'est quoi resfinalmean ?

    Pour avoir une réponse il faut :
    - donner le maximum d'informations
    - essayer d'expliquer le plus clairement possible

    As-tu essayer avant de coder de "pseudo-coder" ce que tu veux faire, c'est-à-dire d'écrire "à la main" l'algorithme que tu cas utiliser pour faire ce que tu souhaites ?
    Peut-être que ce serait plus compréhensible

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    en fait c bon j'ai trouve tout seul
    merci de ton aide

  14. #14
    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 momo032114 Voir le message
    en fait c bon j'ai trouve tout seul
    On pourrait en savoir un peu plus ?

  15. #15
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Par défaut
    ben ouais
    voici mon code
    resfinal est ma matrice et resfinal mean mon mean de chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1:422
        for j=1:948
            x=resfinal(i,j);
            y=resfinalmean(i,1);
            if x~=0
               resfinal(i,j)=x-y;
            end 
        end
    end

  16. #16
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Et pour éviter la double boucle, en 1 seule fois (sauf si garder la moyenne t'intéresse), et en utilisant l'indexage logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    X = [0 0 12 15 18 0 0 0
    0 11 6 2 3 8 0 0
    0 0 0 0 3 6 0 0]
    %objectif : obtenir Y tel que Y(i,j)=X(i,j)-mean(X(i,:)) sauf pour X(i,j)=0
    %Initialisation
    Y=zeros(size(X));
    %Boucle sur les lignes :
    for i=1:size(X,1)
       maLigne=X(i,:);%ième ligne
       %soustraction pour les x ~=0
       Y(i,maLigne~=0)=maLigne(maLigne~=0)-mean(maLigne(maLigne~=0));
    end
    Y

  17. #17
    Membre émérite
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Par défaut
    Voici une autre solution sans recours aux structures itératives imbriquées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    r=[0 0 12 15 18 0 0 0;0 11 6 2 3 8 0 0;0 0 0 0 3 6 0 0];
     
    [m n]=size(r);
    moy=sum(r,2)./sum(r~=0,2)
    u=(r~=0);
    b=repmat(moy,1,n);
    res=r-b.*u

Discussions similaires

  1. Opérations sur les colonnes d'une matrice
    Par george216 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/01/2010, 08h08
  2. Réponses: 3
    Dernier message: 08/04/2009, 12h10
  3. Permuter les lignes d'une matrice
    Par JonasB dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/03/2009, 15h58
  4. Travail sur les éléments d'une matrice.
    Par Jefeh dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/11/2007, 15h10
  5. Comparaison de toutes les lignes d'une matrice
    Par hidies dans le forum MATLAB
    Réponses: 10
    Dernier message: 16/05/2007, 11h11

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