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 :

Vectorisation d'un ensemble de boucles for


Sujet :

MATLAB

  1. #1
    Membre régulier Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Points : 76
    Points
    76
    Par défaut Vectorisation d'un ensemble de boucles for
    Bonjour à tous,

    J'aurai besoin de votre aide sur la vectorisation d'un bout de mon code pour éviter de faire un grand nombre de boucles.

    J'ai deux grilles superposées l'une sur l'autre (une pivoté de X° par rapport à l'autre). Cela permet de faire apparaitre les surfaces d'intersection entre ces deux grilles qui ont chacune une couleur différente.

    Note: une case d'une des grilles représente un pixel de 10*10.
    Pièce jointe 152196

    balayant d'en un premier temps selon x0 et y0 les coin haut gauche d'un pixel, puis une fois le pixel sélectionné je balaye l’intérieur du pixel selon x et y.

    A l'intérieur de chaque pixel je balaye aussi l'ensemble des couleurs.

    Une fois que dans un pixel j'ai trouvé qu'il y a cette couleur, j'incrémente le nombre de "sous-pixels" qu'il y a ds ce "gros" pixel (10*10), nombre qui me sert à calculer l'aire correspondant à chaque couleur.

    Voici mon code :

    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
    cases=1;
     
    for y0=y_0:taille_pixel:y_0+(taille_pixel*(nbre_cases1-1))
         for x0=x_0:taille_pixel:x_0+(taille_pixel*(nbre_cases2-1))
     
             %Calcul de l'aire des couleurs présentes dans le pixel étudié du
             %repère R0.
             %Note: On balaye l'ensemble des pixels de R0 pour mesurer l'aire
             %de chaque couleur présente dans ce pixel.
     
             Aire_couleur = zeros(1,nbre_cases1*nbre_cases2,'single');
     
             for couleur_pixel = 1:nbre_cases1*nbre_cases2
     
                for y=y0:y0+taille_pixel-1
                    for x=x0:x0+taille_pixel-1
     
                        if Detection5(y,x) == couleur_pixel
                            Aire_couleur(couleur_pixel) = Aire_couleur(couleur_pixel) + 1;
                        end
                    end
                end
     
                Aire_couleur(couleur_pixel) = Aire_couleur(couleur_pixel)/((taille_pixel-1)*(taille_pixel-1));
                RR(cases,:)=Aire_couleur(:);                                    % Matrice comportant les % de chaque couleur, il suffit de sommer les lignes correspondantes au meme rayon
     
     
              end       
     
              cases=cases+1;          
     
         end
    end

  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 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 882
    Points
    52 882
    Par défaut
    Pour accélérer le code, tu devrais commencer par pré allouer la mémoire pour la tableau RR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n = numel(y_0:taille_pixel:y_0+(taille_pixel*(nbre_cases1-1)))*numel(x_0:taille_pixel:x_0+(taille_pixel*(nbre_cases2-1)));
    RR = zeros(1,n);
    Ensuite les deux boucles intérieures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for y=y0:y0+taille_pixel-1
        for x=x0:x0+taille_pixel-1
     
            if Detection5(y,x) == couleur_pixel
                Aire_couleur(couleur_pixel) = Aire_couleur(couleur_pixel) + 1;
            end
        end
    end
    peuvent être remplacée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    val = Detection5(y0:y0+taille_pixel-1,x0:x0+taille_pixel-1) == couleur_pixel;
     
    Aire_couleur(couleur_pixel) = sum(val(:));
    Pour aller plus loin, tu devrais pouvoir utiliser la fonction hist dans ton code.
    Celle-ci sera sans doute plus rapide.
    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)

  3. #3
    Membre régulier Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Points : 76
    Points
    76
    Par défaut
    Merci pour votre réponse,

    En effet votre alternative pour les boucles marche super bien, mais en revanche je ne saurai expliquer pour maintenant la ligne ci-dessous est si gourmande en temps (444sec / 800sec d'exécution totale) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RR(cases,:)=Aire_couleur(:);
    En ce qui concerne la fonction hist j'ai du mal à analyser ce que renvoie cette fonction.

    Par exemple si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Histo = hist(Detection5);
    J'obtiens Histo qui est une matrice 10*320 alors que j'ai en tout 900 couleurs sur mon image (Note: 320 = longueur = largeur de l'image Detection5).

    Le 10 provient du nombre de bins de base de la fonction lorsqu'on ne met pas de variable après les données, mais je ne vois pas comment m'en sortir pour récupérer le nombre de pixel de couleur.

  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 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Alex3434 Voir le message
    je ne saurai expliquer pour maintenant la ligne ci-dessous est si gourmande en temps (444sec / 800sec d'exécution totale) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RR(cases,:)=Aire_couleur(:);
    Cette ligne n'a rien à faire à l'intérieur de la boucle sur couleur_pixel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for couleur_pixel = 1:nbre_cases1*nbre_cases2
     
        ...
     
    end
     
    RR(cases,:) = Aire_couleur(:);
    As-tu fais la préallocation de mémoire sur RR ?
    Je me suis peut être trompé dans les dimensions finales dans mon précédent message ?

    Et je me suis également trompé pour hist, je voulais parler de la fonction histc
    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
    Membre régulier Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Points : 76
    Points
    76
    Par défaut
    Oui j'avais alloué la mémoire bien avant ce bout de code. Elle n'apparaît pas dans la portion que j'ai mis.

    Au temps pour moi j'avais pas vu que je l'avais laissé au mauvais endroit.

    Non non les dimensions finales sont bien les bonnes.

    Je vais essayer de voir comment utiliser histc.

    Merci beaucoup

Discussions similaires

  1. Boucle FOr sur un ensemble de valeurs
    Par Daniela_ dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/11/2013, 16h35
  2. Réponses: 8
    Dernier message: 20/04/2012, 22h37
  3. [Débutant] Deux boucles for vs vectorisation
    Par slaima15 dans le forum MATLAB
    Réponses: 7
    Dernier message: 09/05/2011, 17h43
  4. Vectorisation boucle for (simple et imbriquée)
    Par derzy971 dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/11/2009, 16h42
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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