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

Algorithmes et structures de données Discussion :

Simplification de boucles dans une combinaison de matrices


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Simplification de boucles dans une combinaison de matrices
    Bonjour à tous,

    Tout d'abord, j'aimerai dire que ce site est génial, c'est une vrai mine d'or. Malheureusement je n'ai pas réussi à trouver le filon qui m'intéresse.
    Je me permets donc d'ouvrir une nouvelle discussion.

    Je dispose de 4 matrices de 3 dimensions : M1(i,j,2) ; M2(k,l,2) ; M3(m,n,2) et M4(o,p,2).
    J'aimerai pour chaque combinaison possible vérifier certaines conditions. Si ces conditions sont remplies, j'aimerai enregistrer les indices matriciels correspondants (i,j,k,l,m,n,o et p) afin d'être capable d'aller chercher les valeurs correspondantes dans les matrices.
    Il y a au total donc i*j*k*l*m*n*o*p combinaisons.

    J'ai dans un premier temps pensé à faire la méthode "bourrin" en codant ceci avec des boucles for.
    deux problèmes se posent à moi:
    1) La matrice de résultat "solution" dans laquelle j'aimerais stocker les indices vérifiant les conditions, pour limiter le temps de calcul, doit être prédéfini. Or, si j'ai 4 matrices de tailles (50,50,2) il me faudrait pré-créer une matrice de taille (50^8,8). Et le genre de fonctions zeros(50^8,8) dépasse la limite autorisée par Matlab.
    2) Le temps de calcul est extrêmement long. Ma boucle a pris 3h ce matin pour arriver à terme...

    Je me demande donc s'il existe des fonctions dans Matlab permettant de simplifier/optimiser mon algorithme, en évitant au maximum les boucles qui sont chronophages.

    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
     
    sol=0;
    for i=1:imax 
        for j=1:jmax
            for k=1:kmax
                for l=1:lmax
                    for m=1:mmax
                        for n=1:nmax
                            for o=1:omax
                                for p=1:pmax
                                    if   (M1(i,j,1)+M2(k,l,1)+M3(m,n,1)+M4(o,p,1))>=(-(FX_ENV-precision_X)) ... % condition sur la limite inférieure de FXenv
                                    && (M1(i,j,1)+M2(k,l,1)+M3(m,n,1)+M4(o,p,1))<=(-(FX_ENV+precision_X)) ... % condition sur la limite supérieure de FXenv
                                    && (M1(i,j,2)+M2(k,l,2)+M3(m,n,2)+M4(o,p,2))>=(-(FY_ENV-precision_Y)) ... % condition sur la limite inférieure de FYenv
                                    && (M1(i,j,2)+M2(k,l,2)+M3(m,n,2)+M4(o,p,2))<=(-(FY_ENV+precision_Y)) ... % condition sur la limite inférieure de FYenv
                                    && (((X1*M1(i,j,2)-Y1*M1(i,j,1))+(X2*M2(k,l,2)-Y2*M2(k,l,1))+(X3*M3(m,n,2)-Y3*M3(m,n,1))+(X4*M4(o,p,2)-Y4*M4(o,p,1)))>=(-(MZ_ENV-precision_M)))... % condition sur la limite inférieure de MZenv
                                    && (((X1*M1(i,j,2)-Y1*M1(i,j,1))+(X2*M2(k,l,2)-Y2*M2(k,l,1))+(X3*M3(m,n,2)-Y3*M3(m,n,1))+(X4*M4(o,p,2)-Y4*M4(o,p,1)))<=(-(MZ_ENV+precision_M))) % condition sur la limite supérieure de MZenv
                                    % si les critères sur les efforts et moment
                                    % sont validés alors on note les indices des
                                    % solutions correspondants
                                    sol=sol+1;
                                    solution(sol,:)=[i,j,k,l,m,n,o,p];
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    Merci beaucoup pour votre aide.
    Je suis ouvert à toute proposition qui m'aiderait à avancer sur ce sujet et n’hésitez pas à me demander quoique ce soit si je ne suis pas clair.

    Bien cordialement,
    Jérémie.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut


    À regarder ton problème, je ne comprends pas du tout ce que tu souhaites réellement faire… A priori, difficile d'optimiser ton code comme il est là (du moins, au niveau algorithmique), sans chercher à le comprendre. Que veux-tu faire avec ce programme ? As-tu des propriétés particulières dans tes matrices ? (Par exemple, toutes les valeurs d'un M1..4 sont au-dessus de tel seuil, ce qui permet de faire certains tests en amont et limiter le nombre d'itérations en amont. De là, par exemple, une fois que tu as itéré sur i et j, tu peux vérifier la valeur de M1(i,j,1) et vérifier s'il est possible que la première condition soit remplie : la valeur pourrait être trop élevée pour que ça puisse marcher.)
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour et merci de ta réponse rapide Dourouc05, je te prie d'excuser ma réponse tardive.

    Imaginons que nous avons 4 bateaux, chaque bateau tire avec un certain angle et une certaine force. Les matrices M1 à M4 servent à stocker toutes les combinaisons possibles de couple force/angle pour chaque bateau. Cela revient à stocker des positions que peut prendre chaque bateau dans sa zone de navigation. J'ai créée ces matrices grâce à des boucles sur la force avec un certain pas et sur l'angle. Pour plus de précision j'ai utilisé des petits pas, mais en contrepartie j'avais de grosses matrices.

    Une fois ces matrices construites, je voulais combiner toutes les possibilités entre elles. En les combinant, je voulais vérifier que certains critères d'efforts et de moment soient validés. Je n'avais pas trouvé d'autre solution pour ce faire que de repartir dans une boucle (cf. mon précédent post). Le calcul était super long.

    Du coup, ça m'a pris un moment mais j'ai trouvé une solution pour écourter de façon drastique le temps de résolution de mon problème. Je vais vous le partager ici.

    En fait, au lieu de construire 1 matrice par bateau, contenant toutes les positions qu'il pourrait prendre, avec des boucles for sur l'angle et la force, j'ai utilisé la fonction random.
    J'ai au final construit une seule grosse matrice de taille (n,4,2) où n fois, je tire une position aléatoire dans la zone de navigation du bateau 1 en position (n,1,: ). De même pour le bateau 2 en position (n,2,: ) jusqu'au quatrième bateau en (n,4,: ).
    J'ai donc n fois un ensemble de combinaison possible où mes 4 bateaux travaillent ensemble. En choisissant un n important je suis assez précis.
    L'avantage c'est que pour vérifier mes critères, je n'ai plus à travailler sur un ensemble de boucles mais sur une seule, sur le nombre de ligne n de ma matrice générale.

    Je ne sais pas si je suis clair, car je suis à fond dedans mais en dire davantage n'aiderait pas à saisir la conclusion de mon post initial.

    Bref, ce problème est résolu. J'espère avoir été assez clair sur ma façon de résoudre mon problème.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/05/2013, 15h04
  2. Stocker les resultats de ma boucle dans une Matrice
    Par Erebus dans le forum MATLAB
    Réponses: 0
    Dernier message: 06/05/2013, 13h55
  3. boucle dans une matrice qui change de taille
    Par Ryma_d3 dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/03/2012, 14h35
  4. renvoyer les résultats d'une boucle dans une matrice
    Par Ptinéwik dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/07/2008, 23h37
  5. Creer une boucle dans une requête ???
    Par fdloisel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2004, 14h05

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