Optimisation de la vitesse en matlab

lammouch Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
 anormal -
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

xquost
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention  
 
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
xquost
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
anormal
 
Ce guide vous donne plusieurs source d'optimisation du code matlab...
http://polyblog.zz.mu/?p=24
0