Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

detection des NaN et les remplacer par la valeur moyenne avec Matlab



  1. #1
    majnoun

    detection des NaN et les remplacer par la valeur moyenne avec Matlab


    ------

    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];

    %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. Publicité
  3. #2
    majnoun

    Re : detection des NaN et les remplacer par la valeur moyenne avec Matlab

    Bonjour,

    voici un autre code, mais ca ne marche pas toujours, j'obtiens l'erreur suivante ;
    ??? Subscript indices must either be real positive integers or logicals.

    que pensez vous ?

    % 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

  4. #3
    JPL
    Responsable des forums

    Re : detection des NaN et les remplacer par la valeur moyenne avec Matlab

    Pour poster du code lisible (avec les indentations) utilise la balise Code
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  5. #4
    majnoun

    ??? Error using = Not enough input arguments.

    Bonjour,

    j'ai un problème, je veux tracer un graphe avec une matrice formée de 4 colonnes que j'importe d'un fichier excel, mais j'obtiens toujours la même erreur ci dessous :

    ??? Error using = Not enough input arguments.

    mon code est le suivant :

    [num, txt, tab] = xlsread('test_mars_2009_01_ZSM .xls');
    x_day=test_mars_2009_01_ZSM(:, 1);
    AD_50=test_mars_2009_01_ZSM(:, 2);
    AD_53=test_mars_2009_01_ZSM(:, 3);
    AD_55=test_mars_2009_01_ZSM(:, 4);

    plot(x_day,AD_50, 'LineWidth',2,'Color',[0 0 0],...
    'DisplayName','50_AD');
    hold on;
    plot(x_day,AD_53,'LineWidth',2 ,'Color',[1 0 0],...
    'DisplayName','53_AOD');
    hold on;
    plot(x_day,AD_550,'LineWidth', 2,'Color',[0 0 1],...
    'DisplayName','55_AD');

    je peux aussi vous envoyer mes données formées de 4 colonnes et de 153 lignes

    merci d'avance,

  6. A voir en vidéo sur Futura

Discussions similaires

  1. Remplacer les Eproms 2732 par des EEprom?
    Par Georges974 dans le forum Électronique
    Réponses: 1
    Dernier message: 29/01/2009, 11h38
  2. Valeur moyenne
    Par Crossover dans le forum Physique
    Réponses: 3
    Dernier message: 28/01/2009, 07h03
  3. détection de nuages dans le ciel avec matlab
    Par caro_demo dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 17/03/2008, 19h20
  4. maximum d'une valeur avec Matlab
    Par JoeBlo dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 06/04/2006, 09h31
  5. remplacer les ampoules de mon velo par des leds
    Par yoyogame dans le forum Électronique
    Réponses: 3
    Dernier message: 28/10/2005, 08h56
Découvrez nos comparatifs produits sur l'informatique et les technologies.