Rechercher : dans
Par :

Optimisation de la vitesse en matlab

Dernière réponse le 24 avr 2008 à 15:59:39 lammouch, le 3 mar 2008 à 09:39:21 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « optimisation de la vitesse en matlab » dans :
[ADSL] Tester la vitesse de connexion internet (test de débit) VoirLes vitesses de téléchargement (théoriques) : Connexions Pourquoi cette différence ? J'ai un ADSL xxxx, mais quand je télécharge ça va moins vite que ce que ça devrait, pourquoi ? L'upload est trop lent ! Liens Tests de débit...
Optimiser Firefox VoirOptimisation avec Haut Débit Si votre ordinateur a un processeur peu puissant Optimiser l'utilisation de la mémoire Logiciel d'optimisation de Firefox J'ai fait une fausse manipulation J'ai créé une valeur/chaîne de trop J'ai mal attribué...
[Carte graphique Nvidia] Réglages carte graphique VoirA tous les heureux propriétaire de carte graphique, voici une solution très efficace pour optimiser les réglages de votre Carte graphique... Nvidia a sorti un logiciel d'optimisation et de réglage pour votre carte graphique... Précisions...
Télécharger BootVis VoirSi votre ordinateur est lent à démarrer, il est possible d'améliorer la vitesse de chargement en optimisant le processus de boot. Microsoft propose un outil appelé "BootVis" permettant d'optimiser la vitesse de chargement de Microsoft Windows....
Optimisation du BIOS VoirQu'est-ce que le BIOS? Le BIOS (Basic Input Output System) est une petite mémoire située sur la carte-mère, dont les données définissent les paramètres du système. Certaines données sont inscrites dans une mémoire morte (ROM), il n'est donc pas...

1

Char Snipeur, le 3 mar 2008 à 09:59:34

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...) Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

2

lammouch, le 3 mar 2008 à 10:24:13

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 ..

Répondre à lammouch

3

Char Snipeur, le 3 mar 2008 à 10:35:28

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);
Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

4

xquost, le 24 avr 2008 à 15:50:07

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 .....

Répondre à xquost

5

 xquost, le 24 avr 2008 à 15:59:39

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 ....

Répondre à xquost