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.