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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 313
    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 313
    Points : 52 939
    Points
    52 939
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 313
    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 313
    Points : 52 939
    Points
    52 939
    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 éminent sénior
    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
    Points : 14 828
    Points
    14 828
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 éminent sénior
    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
    Points : 14 828
    Points
    14 828
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 éminent sénior
    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
    Points : 14 828
    Points
    14 828
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    Par défaut
    si en fait j'ai reflechi ensuite a ce que j'avais poste mais c'etait trop tard

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 éminent sénior
    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
    Points : 14 828
    Points
    14 828
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 313
    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 313
    Points : 52 939
    Points
    52 939
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 37
    Points
    37
    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 éminent sénior
    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
    Points : 14 828
    Points
    14 828
    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 éprouvé
    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 : 40
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    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