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 :

Vectoriser des boucles


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 54
    Points : 30
    Points
    30
    Par défaut Vectoriser des boucles
    Bonjour a tous ;
    Je voudrai bien optimiser mon code en vectorisant les boucles dedants :
    Voila mon probleme:
    Si j'ai une matrice par exemple A d'ordre n=9 et une matrice P et un vecteur V contient des indices de lignes et de colonnes de la matrice A ,ds chaque itération je calcule C1 ,C2 et C pour remplir Y.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    P =[6     2     7     5     3
         6     2     5     7     3
         6     2     5     3     7]
     
     V=[ 9     8     4     1]
     a=3;
     X1=0;
    Y=cell(n-1,1);
     
        for d=n-1:-1:1
        if d~=n-1
           % transformer les valeurs "d+1" en valeurs "d" et les valeurs "d" en valeurs "d+1" pour V et P 
             P = P-((d+1)-d)*(P==d+1)+((d+1)-d)*(P==d);
             V(:,1:n-(a+2)) = V(:,1:n-(a+2))-((d+1)-d)*(V(:,1:n-(a+2))==d+1)+((d+1)-d)*(V(:,1:n-(a+2))==d);
             %calculer C1 C2 C pour remplir Y
    rows = P(:,1:a+1);
    cols = P(:,2:a+2);
    C1= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
    [~,IX]=sort(C1,'descend');
    rows = P(:,[1 a+2:-1:3]);
    cols = P(:,a+2:-1:2);
    C2= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
    [~,IY]=sort(C2,'descend');
    rows = V(:,1:n-(a+3));
    cols = V(:,2:n-(a+2));
    C=  sum(A( sub2ind(size(A),rows,cols) ) ) ;
    if C1(IX(1))>C2(IY(1))
    X0=C1(IX(1))+C+A(V(n-(a+2)),P(IX(1),1));
    if X0>X1
    Y{n}=[V(1,1:n-(a+2)) P(IX(1),:)];
    X1=X0;
    end
    else
    X0=C2(IY(1))+C+A(V(n-(a+2)),P(IY(1),1));
    if X0 > X1
    Y{n}=[V(1,1:n-(a+2)) P(IY(1),1) P(IY(1),a+2:-1:2)];
    X1=X0;
    end
    end
        end
        D=P;
        V2=V(1,1:n-(a+2));
        for r=n-1:-1:2
            D(D(:,end)==r,:)=[];
            if isempty(D)==0
                % transformer les valeurs "r+1" en valeurs "r" et les valeurs "r" en valeurs "r+1" pour V2 et D 
     
    D = D-((r+1)-r)*(D==r+1)+((r+1)-r)*(D==r);
    V2(:,1:n-(a+2)) = V2(:,1:n-(a+2))-((r+1)-r)*(V2(:,1:n-(a+2))==r+1)+((r+1)-r)*(V2(:,1:n-(a+2))==r);
     
     rows = D(:,1:a+1);
    cols = D(:,2:a+2);
    C1= sum( A( sub2ind(size(A),rows,cols) ) ,2); 
    [~,IX]=sort(C1,'descend');
    rows = D(:,[1 a+2:-1:3]);
    cols = D(:,a+2:-1:2);
    C2= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
    [~,IY]=sort(C2,'descend');
    rows = V2(:,1:n-(a+3));
    cols = V2(:,2:n-(a+2));
    C=  sum(A( sub2ind(size(A),rows,cols) ) ) ;
    R2=C1(IX(1));
    R3=C2(IY(1));
    if R2 >= R3
    X0=C1(IX(1))+C+A(V2(n-(a+2)),D(IX(1),1));
    if X0 > X1
    Y{r}=[V2(1,1:n-(a+2)) D(IX(1),:)];
    X1=X0;
    end
    else
    X0=C2(IY(1))+C+A(V2(n-(a+2)),D(IY(1),1));
    if X0 > X1
    Y{r}=[V2(1,1:n-(a+2)) D(IY(1),1) D(IY(1),a+2:-1:2)];
    X1=X0;
    end
    end
            end
        end
        end
    J’aimerai bien vectorisée ces deux boucle quelqu’un aura une idée, merci d’avance

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Il va falloir que tu expliques en francais/mathématiques ce que tu veux faire

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Je me explique :
    Ds la 1 ère itération :
    Pour P et V :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    P =[6     2     7     5     3
         6     2     5     7     3
         6     2     5     3     7]
     
     V=[ 9     8     4     1]
    Je calcule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A(9,8)+A(8,4)+A(4,1)+A(1,6)+A(6,2)+A(2,7)+A(7,5)+A(5,3)=10  %par exemple
    A(9,8)+A(8,4)+A(4,1) )+A(1,6)+A(6,2)+A(2,5)+A(5,7)+A(7,3)=9
    A(9,8)+A(8,4)+A(4,1) )+A(1,6)+A(6,2)+A(2,5)+A(5,3)+A(3,7)=11
    Et aussi a partir de P on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P’=[6   3 5 7 2
       				6  3 7 5 2
         				6  7 3 5 2]
    Et je calcule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A(9,8)+A(8,4)+A(4,1)+A(1,6)+A(6,3)+A(2,7)+A(7,5)+A(5,3)=12
    A(9,8)+A(8,4)+A(4,1) )+A(1,6)+A(6,3)+A(2,5)+A(5,7)+A(7,3)=13
    A(9,8)+A(8,4)+A(4,1) )+A(1,6)+A(6,7)+A(2,5)+A(5,3)+A(3,7)=13
    Je prends que le max « un seul» et Y{n}soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Y{n}=[9  8  4 1 6 3 7 5 2]
    Et ainsi de suite pour chaque Pet V « et aussi pour D et V2 a partir de Pet V »
    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
    for d=n-1:-1:1
            % transformer les valeurs "d+1" en valeurs "d" et les valeurs "d" en valeurs "d+1" pour V et P 
             P = P-((d+1)-d)*(P==d+1)+((d+1)-d)*(P==d);
             V(:,1:n-(a+2)) = V(:,1:n-(a+2))-((d+1)-d)*(V(:,1:n-(a+2))==d+1)+((d+1)-d)*(V(:,1:n-(a+2))==d);
             % trouver Y
             :
    	   :
     
             D=P;
             V2=V(1,1:n-(a+2));
             for r=n-1:-1:2
                 D(D(:,end)==r,:)=[];
                % transformer les valeurs "r+1" en valeurs "r" et les valeurs "r" en valeurs "r+1" pour V2 et D 
     
                    D = D-((r+1)-r)*(D==r+1)+((r+1)-r)*(D==r);
                    V2(:,1:n-(a+2)) = V2(:,1:n-(a+2))-((r+1)-r)*(V2(:,1:n-(a+2))==r+1)+((r+1)-r)*(V2(:,1:n-(a+2))==r);
     
                     % trouver Y
             end
        end
    J'espere que j'ai expliqué bien.
    Merciiiiiiiiiiiii

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Pas facile à suivre, on va y aller pas à pas en commençant par les boucles internes.
    Voici comment calculer ta 1ere ligne:
    - Définir les vecteurs i et j des indices
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VP= [V,P(1,:)];
    ij= [VP(1:end-1),VP(2:end)];
    - Extraire et sommer A(i(1),j(1)), A(i(2),j(2)),...
    lini= sub2ind(size(A),ij(:,1),ij(:,2));
    premiere_somme= sum(A(lini));
    Pour vectoriser cette opération, il faut définir i et j comme des matrices, ou chaque colonne de i et de j est comme précédemment, puis appliquer la même chose. Tu stockes tout ca dans une matrice Y que tu max() sur la bonne dimension.

    Pour "D et V2 a partir de P et V", je suis pas sur d'avoir compris. Il faut refaire la même chose ?

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    désolé je ne comprends pas ,
    j'ai pensé que mon problème sont les boucle sur d et r?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for d=n-1:-1:1
     
             for r=n-1:-1:2
     
             end
        end
    pour les sommes et Y
    j'ai ce code que j'ai pensé que c'est un code vectorisser ,non ?

    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
    rows = P(:,1:a+1);
    cols = P(:,2:a+2);
    C1= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
    [~,IX]=sort(C1,'descend');
    rows = P(:,[1 a+2:-1:3]);
    cols = P(:,a+2:-1:2);
    C2= sum( A( sub2ind(size(A),rows,cols) ) ,2) ;
    [~,IY]=sort(C2,'descend');
    rows = V(:,1:n-(a+3));
    cols = V(:,2:n-(a+2));
    C=  sum(A( sub2ind(size(A),rows,cols) ) ) ;
    if C1(IX(1))>C2(IY(1))
    X0=C1(IX(1))+C+A(V(n-(a+2)),P(IX(1),1));
    if X0>X1
    Y{n}=[V(1,1:n-(a+2)) P(IX(1),:)];
    X1=X0;
    end
    else
    X0=C2(IY(1))+C+A(V(n-(a+2)),P(IY(1),1));
    if X0 > X1
    Y{n}=[V(1,1:n-(a+2)) P(IY(1),1) P(IY(1),a+2:-1:2)];
    X1=X0;
    end
    end
    Merci

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    La boucle sur d sert à faire les calculs des différentes sommes ? Si oui, et si tu utilises la version matricielle que je propose, cela revient à vectoriser ta boucle interne "for d=n-1:-1:1". Je ne sais pas ce que représente Y à partir des sommes que tu décris.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    je vais essayer d'expliquer encore mieux :
    1. Pour d=n-1
    Ona pour P et V :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    P =[6     2     7     5     3
         6     2     5     7     3
         6     2     5     3     7]
     
     V=[ 9     8     4     1]
    Je calcule les sommes pour trouver le max et donc Y{n}
    Pour cette P et V on a une boucle sur r "for r=n-1:-1:2"
    D=P ;
    V2=V ;
    Pour r=n-1 on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D==P ;
    V2=[8 9 4 1] ; % transformer les valeurs "n" en valeurs "n-1" et les valeurs "n" en valeurs "n-1" pour V2 et D
    Et Je calcule les sommes pour trouver le max et donc Y{n-1}
    Pour r=n-2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    D=[ 6     2     8     5     3
         6     2     5     8    3
         6     2     5     3     8]
     
    V2=[7 9 4 1] ;
    Et Je calcule les sommes pour trouver le max et donc Y{n-2}
    Pour r=n-3
    .............
    Et ainsi de suite
    2. Pour d=n-2 ;
    P soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    P=[6     2     8     5     3
         6     2     5     8     3
         6     2     5     3     8]
    Et :
     
    V=[9     7     4     1]
    La même chose pour cette P et V ona une boucle sur r "for r=n-1:-1:2"

    D=P ;
    V2=V ;
    Pour r=n-1 on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    D==[6     2     9     5     3
         6     2     5     9     3
         6     2     5     3     9]
    Et :
     
    V2=[8     7     4     1]
    Et Je calcule les sommes
    Pour r=n-2
    …………….
    Et ainsi de suite

    Rem : Pour Y je stocke seulement un seul vecteur ds chaque Y{i} « i=2:n »
    où la somme est Max ,donc je cherhe parmis tous les vecteurs au moins un vecteur où la somme est max.

    Merci pour votre réponse, et est-ce que vous pouvez m'expliquer avec détail votre idée
    Désolé Je suis plus que débutante sur Matlab

Discussions similaires

  1. Vectoriser des boucles
    Par Aedric dans le forum Octave
    Réponses: 8
    Dernier message: 26/06/2015, 11h18
  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