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

Octave Discussion :

Vectoriser des boucles


Sujet :

Octave

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Vectoriser des boucles
    Bonjour,

    Je dispose de 3 boucles permettant de créer une image pixel par pixel à partir de données (énergie en fonction de x et y, matrice E). Le problème est que le temps de calcul est beaucoup trop long pour des matrices de dimensions élevées (40 000*3).


    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
    34
    35
    36
    37
    tic
     
    pixelnumber=input ('the number of pixel : ');
     
    % E matrice énergie position x position y
     
    V=min(E);
    T=max(E);
    n=length(E);
     
    %maillage en x et y
    x=linspace(V(1,2),T(1,2),pixelnumber);
    y=(linspace(V(1,3),T(1,3),pixelnumber))';
     
    %P matrice de l'image
    P=zeros(pixelnumber,pixelnumber);
     
    % i suivant les lignes
    % j suivant les colonnes 
    % k lignes de E
    for i=2:pixelnumber
      for j=2:pixelnumber
        for k=1:n
          if x(1,j-1)<=E(k,2)
            if E(k,2)<x(1,j)
              if y(i-1,1)<=E(k,3)
                if E(k,3)<y(i,1)
                  P(i-1,j-1)=P(i-1,j-1)+E(k,1);
                endif
              endif
            endif
          endif
        end
      end
    end
    image(P)
    toc

    J'aimerais vectoriser les boucles si c'est possible pour que le calcul soit plus rapide mais je ne sais pas comment faire. Quelqu'un pourrait-il m'aider?
    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Une première méthode pour s'affranchir de deux boucles: (peut être une petite modif à faire dedans, je n'ai pas testé qu'il marchait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for k=1:n
         idx = find(x(1,1:end-1) <= E(k,2) & x(1,2:end) > E(k,2) & y(1:end-1) <= E(k,3) & y(2:end) > E(k,3) );
         P(idx) = P(idx) + E(k,1);
    end
    PS: tu codes en Matlab? parce que endif est sensé te renvoyer une erreur.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je code sur Octave, ça ne me renvoie pas d'erreur je vais tester ça cet après-midi. Merci

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai testé ça va plus vite cependant je n'obtiens pas la même image. J'ai testé sur un exemple simple et je me suis rendu compte qu'avec le code proposé ça n'avait pas placé les pixels au bon endroit.

    E =

    1.0000 1.5000 1.5000
    2.0000 2.5000 2.5000
    3.0000 3.5000 3.5000
    4.0000 4.5000 4.5000
    5.0000 5.5000 5.5000
    6.0000 6.5000 6.5000
    7.0000 7.5000 7.5000
    8.0000 8.5000 8.5000
    9.0000 9.5000 9.5000
    10.0000 10.5000 10.5000

    Nom : image1.PNG
Affichages : 267
Taille : 4,3 Ko (avec boucle for)

    Nom : image2.PNG
Affichages : 318
Taille : 4,5 Ko (optimisé)

    Comme mon vecteur y est un vecteur colonne, j'ai modifié y mais j'obtiens toujours la même image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for k=1:n
         idx = find(x(1,1:end-1) <= E(k,2) & x(1,2:end) > E(k,2) & y(1:end-1,1) <= E(k,3) & y(2:end,1) > E(k,3) );
         P(idx) = P(idx) + E(k,1);
    end
    Du coup je ne vois pas d'où vient le problème.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Hmm alors là je vais spéculer un peu sur la façon de le résoudre car je ne suis pas sûr que cela va marcher mais essaie un truc de ce genre:

    Code Matlab : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for k = 1:n
         mat_idx = zeros(length(x));
         idx_x = find(x(1,1:end-1) <= E(k,2) & x(1,2:end) > E(k,2));
         idx_y = y(1:end-1) <= E(k,3) & y(2:end) > E(k,3);
         mat_idx(:,idx_x) = idx_y;
         idx_total = find(mat_idx);
         P(idx_total) = P(idx_total) + E(k,1);
         clear mat_idx idx_x idx_y idx_total
    end
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'obtiens ce message d'erreur: "A(I,J,...) = X: dimensions mismatch" pour la ligne 5.

    J'ai donc remplacé les ":" par length(y) et aussi rajouté un find pour idx_y. Je n'ai plus le message d'erreur du coup, cependant le problème avec la localisation des pixels est toujours là mais déplacé en bas de l'image.

    Nom : image3.PNG
Affichages : 229
Taille : 3,6 Ko

    Code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for k = 1:n
         mat_idx = zeros(length(x));
         idx_x = find(x(1,1:end-1) <= E(k,2) & x(1,2:end) > E(k,2));
         idx_y = find(y(1:end-1) <= E(k,3) & y(2:end) > E(k,3));
         mat_idx(length(y),idx_x) = idx_y;
         idx_total = find(mat_idx);
         P(idx_total) = P(idx_total) + E(k,1);
         clear mat_idx idx_x idx_y idx_total
    end

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je viens de tester le premier code avec la matrice E finale.

    Nom : imagesimu.PNG
Affichages : 308
Taille : 20,4 Ko

    Je dois obtenir un disque creux, sur l'image on voit en haut le bas du disque déformé et en bas le haut du disque déformé.

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Attention, je n'ai pas mis de find idx_y = y(1:end-1) <= E(k,3) & y(2:end) > E(k,3); intentionnellement.

    Code Matlab : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for k = 1:n
         mat_idx = zeros(length(x));
         idx_x = find(x(1,1:end-1) <= E(k,2) & x(1,2:end) > E(k,2));
         idx_y = find(y(1:end-1) <= E(k,3) & y(2:end) > E(k,3));
         for z = 1:length(idx_x)
              mat_idx(:,idx_x(z)) = idx_y;
         end
         idx_total = find(mat_idx);
         P(idx_total) = P(idx_total) + E(k,1);
         clear mat_idx idx_x idx_y idx_total
    end

    et comme ça?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'obtiens ça:

    Nom : image4.PNG
Affichages : 306
Taille : 7,6 Ko

    Je ne comprend pas le idx_x(z), ça va prendre les éléments de idx_x ayant pour indice z?

Discussions similaires

  1. [Débutant] Vectoriser des boucles
    Par linda05 dans le forum MATLAB
    Réponses: 6
    Dernier message: 27/06/2014, 17h22
  2. [MS SQL Server] comment faire des boucles en SQL ?
    Par Yorel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2006, 09h41
  3. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46
  4. Je n'arrive pas à faire des boucles dans un répertoire
    Par padodanle51 dans le forum Linux
    Réponses: 4
    Dernier message: 04/05/2006, 18h04
  5. simplement des boucles
    Par devdébuto dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 08h50

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