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 :

[max] par fenêtre


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    Par défaut [max] par fenêtre
    Bonjour,

    j'ai un vecteur de 20 éléments, j'aimerais avoir la valeur et l'indice des max par fenêtre de 5 : max entre 1 et 5, max entre 6 et 11 etc...

    Je peux faire un truc comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 45]
     
                            data1 = data(1:5);
                            [max_data1,index_max_data1] = max(data1) ;
                            index_max_data1 = index_max_data1 ; 
     
                            data2 = data(6:10);
                            [max_data2,index_max_data2] = max(data2) ;
                            index_max_data2 = index_max_data2 + 5 ;
     
                            data3 = data(11:15);
                            [max_data3,index_max_data3] = max(data3) ;
                            index_max_data3 = index_max_data3 + 10 ;
    [...]
    mais n'y a t il pas plus simple?

    Merci

  2. #2
    Expert confirmé
    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
    Par défaut
    Ce que tu as écrit peut assez facilement se transformer en boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 45];
    i=1;
    for k=1:5:length(data)
        datak=data(k:k+4);
        [max_data(i),idx] = max(datak);
        index_max_data(i)=idx+(i-1)*5;
        i=i+1;
    end
    Après je suis sure qu'il y a des petits malins qui vont réussir à t'écrire ça en 2 ou 3 lignes avec des fonctions du genre ARRAYFUN

  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 317
    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 317
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 45]
     
    temp = reshape(data,5,[])
     
    [max_data,index_max_data] = max(temp)
     
    index_max_data = index_max_data + (0:numel(index_max_data)-1)*5
     
    data(index_max_data)

  4. #4
    Membre éprouvé
    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
    Par défaut
    Merci bien !

    Question subsidiaire : Je ne vois pas trop comment trouver l'index du premier nombre supérieur à une valeur.

    même exemple, ici trouver le 1er nombre > 10 et son indice ,ici 88, index=4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data = [2 5 4 88 5 4 5 6 4 5 99 5 8 5 44 54 78 52 56 45]
    Je pourrais faire un truc comme sortir tous les éléments supérieurs à 10 et leur indices, fait un SORTROWS sur l'indice et sortir la 1ere valeur mais c'est un peu compliqué, et long en temps de calcul, y'a t il plus simple?

    Encore merci

    EDIT :
    Un truc comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    j=1;
    for i =1:length(data); 
        if data(i)>10 ; 
            
            index(j) = i 
            j=j+1 ; 
            break ;
        end
    end
    answer = index(1)

  5. #5
    Expert confirmé
    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
    Par défaut
    Cette fois-ci je sais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx=min(find(data>10))
    data(idx)
    Tout simplement

  6. #6
    Membre éprouvé
    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
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    Cette fois-ci je sais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idx=min(find(data>10))
    data(idx)
    Tout simplement
    Ha oui, pas mal !

    Mais pour utiliser MIN, il doit lire tout le vecteur non? est ce qu'une boucle avec un BREAK n'irait elle pas plus vite? (oui car en faire mon vecteur n'est pas de taille 20*1 mais 5000*1 et j'en ai 1 millions )

    Merci !

  7. #7
    Expert confirmé
    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
    Par défaut
    Peut-être par contre j'oubliais que FIND dispose aussi d'arguments intéressants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx=find(data>10,1,'first')
    Par contre je ne sais pas comment il fonctionne donc il faut tester pour le temps sur des vecteurs de tailles diverses pour voir si la boucle FOR avec un BREAK n'est pas plus rapide.

    Pour le code je dirais plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i =1:length(data); 
        if data(i)>10        
            index= i 
            break ;
        end
    end

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

Discussions similaires

  1. max par catégorie de mois
    Par hafka007 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/02/2007, 16h32
  2. [Access 2003] requete sql date max par certain champs
    Par Gary_Stoupy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/02/2007, 09h36
  3. Comment faire un MAX par libellé
    Par prophete3d dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/06/2006, 10h54
  4. Réponses: 3
    Dernier message: 14/04/2006, 09h57
  5. Renseignement pop-up par fenêtre apellante - Firefox / IE
    Par damjal dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/12/2005, 16h53

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