Optimisation de la vitesse en matlab
lammouch
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
anormal -
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.
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:
- Optimisation de la vitesse en matlab
- Optimisation pc - Accueil - Utilitaires
- Test vitesse pc - Guide
- Vitesse du processeur - Guide
- Augmenter vitesse pc windows 10 - Guide
- Test vitesse ssd - Guide
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 .....
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 .....
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 :
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; endMais si tu as vraiment besoin de vitesse d'exécution, il faudra porté ton programme dans un langage compilé (C, Pascal, Fortran, Java...)
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 ....
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 ....
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 :
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);
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question