Optimisation de la vitesse en matlab

Fermé
lammouch Messages postés 2 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 3 mars 2008 - 3 mars 2008 à 09:39
 anormal - 28 sept. 2013 à 17:17
Bonjour,
je voudrais savoir comment on pourra augmenter la vitesse de ce code suivant:

for i=1:1:power(d,3)
MIN=min(F(:,2));
fprintf('%.0f de %.0f\n',i,power(d,3));
for j=1:1:power(n,3)
if real( sqrt((F(i,1)-D(j,1))^2+(F(i,2)-D(j,2))^2+(F(i,3)-D(j,3))^2))<=a+u
h=8.63*sqrt(1-power((sqrt((F(i,1)-D(j,1))^2+(F(i,2)-D(j,2))^2+(F(i,3)-D(j,3))^2)./a),2));
t=power((1-(sqrt((F(i,1)-D(j,1))^2+(F(i,2)-D(j,2))^2+(F(i,3)-D(j,3))^2)./a).^2),m/2);
b=abs(real(besseli(m,h))./(real((besseli(m,alpha)))).*real(t));%création du blob
V(d*u+MIN-F(i,2),d*u+MIN+F(i,1),d*u+MIN+F(i,3))= V(d*u+MIN-F(i,2),d*u+MIN+F(i,1),d*u+MIN+F(i,3))+ Q(j,1)*b;
else V(d*u+MIN-F(i,2),d*u+MIN+F(i,1),d*u+MIN+F(i,3))= V(d*u+MIN-F(i,2),d*u+MIN+F(i,1),d*u+MIN+F(i,3));
end
end
end

je voudrais remplacer les boucles for par autre chose qui pourra me donner une reponse rapide, mais j'arrive pas..
merci de m'aider le plus tot possible:)
Lama.
A voir également:

5 réponses

Observation 1 / Calcul reel ? ==> sqrt par realsqrt .....
Observation 2 / mutualise les operations cf post precedent !!!

Observation 3 / ne pas faire des boucles c'est tres mal, c'est tres tres mal c'est interdit , c'est vilain .......


Pour faire des tests sur des vecteurs de données on utilise les "logicals" cf >>doc logical

A=rand(50,50);
J=A<0.5;
A(J)=-A(J);

ca marche, c'est rapide mais il est nécessaires de pre-alloué les matrices, sinon les dimensions ce perdent :

A=rand(50,50); B=zeros(size(A));
J=A<0.5;
B(J)=-A(J);
B(~J)=A(J)-0.5;

Si tu doit faire une boucle (par exemple parce que tu ne peux pas vectoriser -faire travailler sur un vecteur- une des opérations) il faut travailler avec la boucle sur le ligne la plus extérieur, et la boucle sur le colonne la plus interiur.


Observation 4 /
Si on pouvait avoir une description du problème sans se cassé les yeux sur le code tu aurais des réponses plus rapide .....
2
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 328
3 mars 2008 à 09:59
Salut.
Il existe plusieurs techniques pour optimiser un code.
En Matlab, il vaut mieux éviter les boucle et utiliser les opération matricielles qui sont normalement optimiser.
Ensuite, il il faut réfléchir et débusquer les opérations que tu fait inutilement plusieurs fois à chaque boucle.
Par exemple, dans tes boucles tu ne modifie que h, t, b et V.
Donc, les calculs suivant peuvent être mis en dehors de la boucle :
power(d,3) power(n,3), m/2, d*u, a+u ...
en affectant une nouvelle variable. Exemple, à la place de :
for i=1:100
    a=3*i+150/1235;
end
écris :
rap=150/1235;
for i=1:100
    a=3*i+rap;
end
Mais si tu as vraiment besoin de vitesse d'exécution, il faudra porté ton programme dans un langage compilé (C, Pascal, Fortran, Java...)
1
lammouch Messages postés 2 Date d'inscription lundi 3 mars 2008 Statut Membre Dernière intervention 3 mars 2008
3 mars 2008 à 10:24
Bonjour,
j'ai essayé de faire ceci mais l'execution du programme n'est pas trop améliorée, est ce qu'il n' y a pas une méthode de remplacer les boucles for et la condition ?? par exemple en utilisant le calcul matriciel ..
0
Pardon pour les fautes d'orthographes partout .... je ne me suis pas relu ....(c'est tres mal)


Une précision "Si tu doit faire une boucle (par exemple parce que tu ne peux pas vectoriser -faire travailler sur un vecteur- une des opérations) il faut travailler avec la boucle sur le ligne la plus extérieur, et la boucle sur le colonne la plus interieur .."

C'est l'inverse désolé, confondu avec un autre langage ==>

la boucle sur les colonnes la plus extérieure, la boucle sur les lignes la plus intérieure et ce parce que :
A=[1,3;2,4]; A(:) donne 1;2;3;4

donc en faisant comme cela, tu accèdes au donné dans l'ordre ou elles sont stockées,

Observation 5: un code en C BIEN ÉCRIS dans un mex file peut faire gagner 30%-50% de temps, attention il faut jouer avec les pointeurs ....
1
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 328
3 mars 2008 à 10:35
En théorie, oui, il faut utiliser la calcul matricielle, mais là tu as une "matrice" à 3 indices, du coup c'est impossible (d'après mes souvenirs).
De toute manière, ça me smble difficile, car ton calcul est complexe, il comprend un if dans une boucle, du coup le calcul matricielle, je ne voi pas comment le faire.
Par contre, j'ai remarqué que tu faisais deux fois un calcul assez complexe :
h=8.63*sqrt(1-power((sqrt((F(i,1)-D(j,1))^2+(F(i,2)-D(j,2))^2+(F(i,3)-D(j,3))^2)./a),2));
t=power((1-              (sqrt((F(i,1)-D(j,1))^2+(F(i,2)-D(j,2))^2+(F(i,3)-D(j,3))^2)./a).^2),m/2);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ce guide vous donne plusieurs source d'optimisation du code matlab...
http://polyblog.zz.mu/?p=24
0