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 :

Remplacer valeurs avec Indexage logique


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut Remplacer valeurs avec Indexage logique
    Salut !

    J'aimerais savoir si il était possible avec l'indexage logique de remplacer les valeurs d'un vecteur sous certaine condition :

    J'aimerais remplacer une valeur du vecteur par NaN si celle ci est plus petite que la précédente.

    Exemple

    A=[1 2 3 2 5]

    devient :

    A=[1 2 3 NaN 5]

    En gros remplacer cette commande :

    for i = 1:length(A)-1
    if A(i)>A(i+1)
    A(i+1) = NaN
    end
    end
    Merci

  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 316
    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 316
    Points : 52 949
    Points
    52 949
    Par défaut
    Pour obtenir les indices :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [1 2 3 2 5]
     
    idx = diff([-inf A])<0

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En utilisant la fonction diff:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d =diff([-inf A]);
    A(d<0) = NaN;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    merci !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Désolé je dérésolve ce problème parce qu'en faite je me suis trompé.
    J'aimerais que toutes les valeurs d'après comptent aussi

    Exemple :

    A = [1 3 7 4 5 8]

    En faite il faudrait que 4 ET 5 soient transformés en NaN et pas seulement 4, en gros qu'aucune valeur de tout le vecteur soit inférieur à une valeur précédente:

    A = [1 3 7 NaN NaN 8]

    Au final le vecteur A ne peut avoir que des valeurs de plus en en plus grandes.

    Merci

  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 316
    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 316
    Points : 52 949
    Points
    52 949
    Par défaut
    Une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A = [7 1 3 7 4 5 8 2 3 4 9 1]
     
    d = diff(A)<0;
     
    while any(d)
     
       A([false d]) = A([d false]);
       d = diff(A)<0;
     
    end
     
    A([false diff(A)==0]) = nan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A =
     
         7     1     3     7     4     5     8     2     3     4     9     1
     
     
    A =
     
         7   NaN   NaN   NaN   NaN   NaN     8   NaN   NaN   NaN     9   NaN

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Points : 52 949
    Points
    52 949
    Par défaut
    Un fichier C-MEX vite fait sans grande optimisation :
    Code C : 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
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
            int nrhs, const mxArray *prhs[]) {
     
        double *A, *B, maxi;
        mwSize i, n;
     
        A = mxGetPr(prhs[0]);
     
        n = mxGetNumberOfElements(prhs[0]);
     
        plhs[0] = mxCreateDoubleMatrix(1, n, mxREAL);
        B = mxGetPr(plhs[0]);    
     
        maxi = A[0];
        B[0] = A[0];
     
        for(i=1;i<n;i++)
        {
            if (A[i]<=maxi)
                B[i] = mxGetNaN();
            else
            {
                maxi = A[i];
                B[i] = A[i];
            }
        }
     
    }

    A compiler comme ceci (en ayant fait "mex -setup" avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> A = [7 1 3 7 4 5 2 8 2 3 4 9 1]
     
    A =
     
         7     1     3     7     4     5     2     8     2     3     4     9     1
     
    >> B = nanifsmallerc(A)
     
    B =
     
         7   NaN   NaN   NaN   NaN   NaN   NaN     8   NaN   NaN   NaN     9   NaN

  8. #8
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    peut-être aussi avec la fonction max (ce qui au final revient au même qu'une boucle donc je ne sais pas si c'est vraiment mieux)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A = [7 1 3 7 4 5 8 2 3 4 9 1];
    i=0;
    ind=zeros(1,length(A));
    i=length(A)+1;
    while i>1
    [m,i]=max(A(1:i-1));
    ind(i)=1;
    end
    A(~ind)=NaN;
    J'avais pensé le faire avec des fonctions "cumulées" (c'est à dire faire en sens inverse, du début vers la fin, regarder le prmier élément, puis les deux premiers...) mais c'est plus difficile à mettre en oeuvre et ça doit être moins efficace.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci pour vos réponses.

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

Discussions similaires

  1. Remplacement valeur avec condition SI
    Par dvdhag123 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/10/2013, 09h39
  2. indexage logique et multiples valeurs
    Par Grasshoper dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/06/2013, 10h24
  3. récupérer et remplacer valeurs avec vlookup ou find
    Par ouioui_cmoi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/03/2008, 10h19
  4. Indexage logique pour plusieurs valeurs
    Par Gui13 dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/07/2007, 10h23
  5. Indexage logique pour plusieurs valeurs
    Par Dam2227 dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/06/2007, 14h48

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