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 :

Mettre en groupe les valeurs NaN


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut Mettre en groupe les valeurs NaN
    Salut
    J'ai un vecteur qui contient des NaN. J'aime bien determiner les positions de début de chaque Groupe de NaN et son fin et que est le groupe le plus longue et son debut et son fin
    Exemple ce vecteur
    x=[ 1 3 5 NaN NaN 6 7 8 9 11 NaN NaN NaN NaN NaN NaN 13 14 15 NaN NaN NaN NaN 18 NaN 15 NaN NaN NaN NaN ]
    on a 5 groupes
    le groupe le plus longue commence à pos 11 et se termine à pos 16
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i = 1:length(x)
    if isnan (x[i])
    posdeb  = i;
    elseif not (isnan (x[i]))
    posfin  = i;
    end
    end
    Mais ce code ne donne rien il manque la mise à jour de pos

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 203
    Points : 68
    Points
    68
    Par défaut
    Voici un autre essai mais pas vraiment de resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pos = [];
     k=1
    for i = 1:length(x)
            if isnan (x(i))
                pos(k)  = i; 
                k=k+1;
            elseif not (isnan (x(i)))
                pos(j)  = i;
                k=k+1;
            end
    end
    x =

    Columns 1 through 23

    1 3 5 NaN NaN 6 7 8 9 11 NaN NaN NaN NaN NaN NaN 13 14 15 NaN NaN NaN NaN

    Columns 24 through 30

    18 NaN 15 NaN NaN NaN NaN

    et

    pos =

    Columns 1 through 23

    0 0 0 4 26 0 0 0 0 0 11 12 13 14 15 16 0 0 0 20 21 22 23

    Columns 24 through 30

    0 25 0 27 28 29 30
    aide SVP

  3. #3
    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
    tout ça semble bien compliqué et tu dois pouvoir t'en sortir sans boucle.

    Voici un code qui joue avec les indexages et la propriété de isan de mettre de 1 ou 0 :
    L'idée générale c'est qu'avec ce vecteur, si tu soustrait l'indice (i+1) par l'indice (i).. Au premier NaN tu auras 1-0 = 1, ensuite pour le groupe de NaN 1-1=0 et enfin pour le dernier NaN: 0-1 = -1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    clear all
    close all
    
    x=[ 1 3 5 NaN NaN 6 7 8 9 11 NaN NaN NaN NaN NaN NaN 13 14 15 NaN NaN NaN NaN 18 NaN 15 NaN NaN NaN NaN ] ;
    x2=[x 0] ; % ajout d'une valeur à la fin (tout sauf NaN) pour l’agrandir ton vecteur d'un indice (servira après)
    NaNvector=isnan(x2)  ; % remplacer les NaN par des 1 et le reste par des 0
    
    NaNvector_shifted = [NaN NaNvector(1:end-1)]; % créer un vecteur identique au précédent mais décalé d'un indice
    
    diff = NaNvector-NaNvector_shifted ; % faire la différence entre les deux
    
    
    deb = find(diff==1)  % lorsque le calcul de diff vaut 1: début des NaN
    fin = find(diff==-1)-1  % lorsque le calcul de diff vaut -1: fin des NaN + 1 indice
    deb te donne les indices de tous les débuts de groupe de NaN
    fin te donne les indices de toutes les fins des groupes de NaN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    deb =
     
         4    11    20    25    27
     
     
    fin =
     
         5    16    23    25    30
    Voilà, je te laisse regarder ça.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

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

    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    x = [1 3 5 NaN NaN 6 7 8 9 11 NaN NaN NaN NaN NaN NaN 13 14 15 NaN NaN NaN NaN 18 NaN 15 NaN NaN NaN NaN];
     
    start  = strfind([false ~isnan(x)], [false true]); % Positions de début
    stop   = strfind([~isnan(x) false], [true false]); % Positions de fin
    groups = arrayfun(@(d,f) x(d:f), start, stop, 'UniformOutput', false); % Formation des groupes
    groupsSize = cellfun(@numel, groups); % Taille de chaque groupe
     
    [maxSize,idx] = max(groupsSize); % Plus grande taille
    start(idx) % Position de début 
    stop(idx)  % Position de fin
    groups{idx} % Groupe le plus long

  5. #5
    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 : 53 166
    Points
    53 166
    Par défaut
    Tu peux aussi t'inspirer de ce défi : [Défis][7] Et maintenant, la suite ! et de la solution donnée par Aurélien sur son blog

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ix = isnan(x);
     
    index = find(diff([ix,inf]));
     
    data = [ix(index) ; [1 index(1:end-1)+1] ; diff([0,index])]
    Ce qui donne avec l'exemple que tu as donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         0     1     0     1     0     1     0     1     0     1
         1     4     6    11    17    20    24    25    26    27
         3     2     5     6     3     4     1     1     1     4
    Les résultats se lisent colonne par colonne. Chaque colonne correspond à un groupe de valeurs successives NaN ou non.

    • La valeur de la première ligne à 1 signifie que la colonne en question correspond à un bloc de NaN consécutifs.
    • La deuxième ligne donne l'indice dans x du début du groupe
    • La troisième ligne donne le nombre d'élément dans le groupe


    Donc dans ce cas, on voit bien que le plus grand groupe de NaN correspond à la colonne 4, avec un indice de début à 11 et qu'il comporte 6 éléments.
    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)

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

Discussions similaires

  1. [XL-2007] Mettre en gras les valeurs identiques dans une colonne et d'une cellule
    Par bienreveille dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/08/2014, 22h38
  2. Gérer les valeurs NAN
    Par SmileSoft dans le forum MATLAB
    Réponses: 9
    Dernier message: 27/01/2012, 10h49
  3. [VB6]Mettre à jour une table avec les valeurs d'une DATAGrid
    Par mbzhackers dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/05/2006, 20h56
  4. Mettre les valeurs d'un tableau dans un fichier
    Par ero-sennin dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 13h47
  5. [XML] mettre les valeurs XML dans un array
    Par yodark dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 05/01/2006, 17h35

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