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 :

detection des valeurs et remplacement par la moyenne


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut detection des valeurs et remplacement par la moyenne
    Bonjour,

    j'ai un ensemble de valeurs qui me permettent de tracer un graphe y en fonction de x sur Matlab, dans ces valeurs j'ai des chiffres comme zéro et 99 et nan qui me créeent des déformations dans ma courbe, comment faire pour les détecter et puis pour les enlever et les remplacer par la valeur moyenne de la dernière valeur avant et de celle d'apres de ce 0 ou 99 ou nan
    ex : supposons si j'ai une matrice A= [ 99 2 3 0 6; 4 5 99 0 0; 7 0 8 99 nan];

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    %test d'une matrice pr calculer la moyenne de valeurs supprimées
    A= [ 99 2 3 0 6; 4 5 99 0 0; 7 0 8 99 nan]; 
    %A(isnan(A)|A==99)=0;
    if A(1,1)==isnan(A(:,: ))|A==99|A==0;
        A(1,1)=A(1,2)
    else if A(n,n)==isnan(A(:,: ))|A==99|A==0;
            n=1;
            n=n+1;
            A(n,n)=A(n,n-1)
        else myvar=isnan(A(:,: ))|A==99|A==0;
    idx=find(myvar==1)
    mais il reste un probleme, je n'obtiens pas la valeur moyene du chiffre avant et de celui apres, par exemple, en enlevant le 0, je dois le remplacer par (3+6)/2, et si je prends le premier 99 ou le dernier nan, le 99 n'a pas de chiffre avant, donc il doit prendre la valeur du chiffre d'apres qui est 2 dans mon cas, et le nan doit prendre la valeur du chiifre d'avant qui est ici 99, mais vu qu'on enlève le 99, il doit prendre la valeur du chiffre avant qui est 8.

    Est ce qu'il y a une maniere de faire ceci ?

  2. #2
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    voici un autre code, mais ca ne marche pas toujours, j'obtiens l'erreur suivante ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? Subscript indices must either be real positive integers or logicals.
    que pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    % Test
    Matrice= [ 99 2 3 0 6;
    4 5 99 0 0;
    7 0 8 99 NaN]
    % Matrice bidon pour voir position index
    B=[1:1:15];
    Z=reshape (B, 3, 5)
    % Fin test
     
    % Détection des cas recherchés
    Where_NaN= isnan(Matrice);
    idx_NaN= find (Where_NaN==1);
    idx_0_99= find (Matrice==0 | Matrice== 99);
     
    % Création d'une liste unique d'index des cas recherchés
    % Noter que je fais la transposée de idx_0_99 car c'est une colonne de vals
    % donc pour la concatenation je dois la mettre en ligne pour aller avec idx_NaN
    Lst_NaN_0_99 = [idx_NaN idx_0_99.']
     
    % Remplacement des valeurs par moyenne des valeurs qui entoure position.
    % 2 cas particuliers: premières et dernières positions dans les colonnes.
    % Les if sont là pour les détecter. Si 1ere position dans colonne, nouvelle
    % valeur égale à valeur suivante. Si dernière position, valeur égale à
    % valeur précédente.
     
    % Détection format matrice
    [lignes, colonnes]= size (Matrice);
     
    % Cas classique (calcul moyenne)
    idx_PosiIn= find (rem(Lst_NaN_0_99(,lignes)~= 0 & rem(Lst_NaN_0_99(,lignes)~=1 );
    % Calculer si pas de cas non voulus côte à côte
    if (Matrice (idx_PosiIn - 1)~= idx_PosiIn( & Matrice (idx_PosiIn + 1)~= idx_PosiIn()
    Matrice (idx_PosiIn)= (Matrice (idx_PosiIn - 1) + Matrice (idx_PosiIn + 1))/2;
    end 
     
    % Position en haut de colonne
    idx_PosiUn= find (rem(Lst_NaN_0_99(,lignes)== 1);
    % Calculer si pas de cas non voulus côte à côte
    if Matrice (idx_PosiUn + 1)~= idx_PosiUn(: )
    Matrice (idx_PosiUn)= Matrice (idx_PosiUn + 1);
    end
     
    % Position en bas de colonne
    idx_PosiLast= find (rem(Lst_NaN_0_99(: ),lignes)==0);
    % Calculer si pas de cas non voulus côte à côte
    if Matrice (idx_PosiLast - 1)~= idx_PosiLast(
    Matrice (idx_PosiLast)= Matrice (idx_PosiLast - 1);
    end

  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 : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par le_fou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ??? Subscript indices must either be real positive integers or logicals.
    Lire dans un premier temps la : Subscript indices must either be real positive integers or logicals.
    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
    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
    Une première solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    A= [ 99 2 3 0 6; 4 5 99 0 0; 7 0 8 99 nan]
     
    idx = isnan(A) | A == 99;
    A(idx) = 0;
     
    [nr,nc] = size(A);
    for n=1:nr
     
        idx = find(A(n,:),1,'first');    
        if ~isempty(idx) && idx~=1
            A(n,1:idx-1) = A(n,idx);
        end
     
        idx = find(A(n,:),1,'last');
        if ~isempty(idx) && idx~=nc
            A(n,idx+1:end) = A(n,idx);
        end
     
        idx = find(~A(n,:));    
        if ~isempty(idx)
            A(n,idx) = .5*(A(n,idx-1)+A(n,idx+1));
        end
     
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A =
     
        99     2     3     0     6
         4     5    99     0     0
         7     0     8    99   NaN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A =
     
        2.0000    2.0000    3.0000    4.5000    6.0000
        4.0000    5.0000    5.0000    5.0000    5.0000
        7.0000    7.5000    8.0000    8.0000    8.0000
    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)

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    merci pour le code, je l'ai essayé et ca marche, mais lorsque je l'applique sur une grande matrice formée de 3000 colonnes et 700 lignes, il me donne l'erreur suivante ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? NaN's cannot be converted to logicals.
     
    Error in ==> al_integr_var_latest at 115
        idx = find(~A(n,:));
    d'ou provient le pb ?

  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 : 52 884
    Points
    52 884
    Par défaut
    Ce n'est pas normal car il ne devrait plus rester de NaN après ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx = isnan(A) | A == 99;
    A(idx) = 0;
    Tu pourrais enregistrer cette matrice dans un fichier mat ?
    Et attacher ce fichier dans une archive (zip ou rar) à un message ?
    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
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    oui je peux la sauver sous format .m

  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 : 52 884
    Points
    52 884
    Par défaut
    Euhh non en format mat avec la fonction SAVE
    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
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    j'obtiens un raccourci avec save

  10. #10
    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
    Par exemple, pour sauver A, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A= [ 99 2 3 0 6; 4 5 99 0 0; 7 0 8 99 nan]
    save('A.mat','A')
    Tu obtiens donc un fichier A.mat dans ton répertoire courant

    Tu fais pareil avec ta matrice, tu mets le fichier mat dans une archive (zip ou rar) et tu l'attache au message
    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)

  11. #11
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    ca ne fonctionne pas, le fichier est trop grand, et puis j'ai essayé de sélectionner toute la matrice et de la copier pour la coller sous excel, mais il bug

  12. #12
    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
    Arf.. ouais c'est normal.

    Ta matrice fait : 3000*700*8/1024/1024 = 16 Mo

    Tu peux aussi utiliser des hébergeurs gratuits sur internet

    Sinon, as-tu exécuté exactement le même code sans le modifier ?
    En remplaçant uniquement A par ta matrice ?
    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)

  13. #13
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    Je suis arrivé à zipper le fichier, c'est presque 5,4 Mb, je pourrais t'envoyer ceci par email, parce que ca ne passe pas par ici

  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 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
    Dans un premier temps :
    Citation Envoyé par Dut Voir le message
    Sinon, as-tu exécuté exactement le même code sans le modifier ?
    En remplaçant uniquement A par ta matrice ?
    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)

  15. #15
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 24
    Points : 3
    Points
    3
    Par défaut
    oui je l'ai utilisé le meme, je n'ai pas besoin de le modifier, j'ai juste des valeurs negatives, que je remplace par des NaN, et puis apres j'execute ton code

Discussions similaires

  1. [2008R2] Remplacement des valeurs manquantes numériques par 0
    Par la_fouine1806 dans le forum SSAS
    Réponses: 3
    Dernier message: 07/08/2014, 15h33
  2. [XL-2010] Affiche des valeurs sur textbox par rapport d'un combobox
    Par Yousssef Boubaddara dans le forum Excel
    Réponses: 3
    Dernier message: 03/12/2013, 14h14
  3. Réponses: 3
    Dernier message: 09/12/2010, 13h38
  4. Réponses: 4
    Dernier message: 14/05/2009, 14h15
  5. Changement des valeurs manquantes NA par 0
    Par fafabzh6 dans le forum R
    Réponses: 3
    Dernier message: 01/04/2008, 17h24

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