bonsoir à vous tous,
j'ai fait un petit programme en MatLab qui marche bien mais il y a le problème de temps d'exécution(très lent) à cause des boucles imbriquées.
Je veux l'optimiser et je ne sais pas comment le faire:(.aidez moi svp:oops:
MERCI
Version imprimable
bonsoir à vous tous,
j'ai fait un petit programme en MatLab qui marche bien mais il y a le problème de temps d'exécution(très lent) à cause des boucles imbriquées.
Je veux l'optimiser et je ne sais pas comment le faire:(.aidez moi svp:oops:
MERCI
Sans le code, ce sera difficil^^
Sans le code on ne peut pas trop t'aider!
mais tout ce que je peux te dire c'est que matlab n'aime pas trop les boucles, il faut "vectoriser" tes boucles (matlab c'est du calcul matriciel)
;)
salut,desolé pour le retard.
voici le programme:
Code:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 %5 points 2 dimensions x=[0 0;1 0;0 1;1 1;.5 .5]; plot(x(1,1),x(1,2),'o') grid on hold on,plot(x(2,1),x(2,2),'o') hold on,plot(x(3,1),x(3,2),'o') hold on,plot(x(4,1),x(4,2),'o') hold on,plot(x(5,1),x(5,2),'or') u=[1 1 1 1 -1]; max=0; for s=0:.1:3 for t=0:.1:1 for m=0:.1:1 for n=0:.1:1.5 l=(-s*u(1)-t*u(2)-m*u(3)-n*u(4))/u(5) if l<0 l=0 end a=[s t m n l] f=0 g=0 for i=1:1:5 for j=1:1:5 g=g+a(i)*a(j)*u(i)*u(j).*(x(i,:)*x(j,:)'+1)^3 end f=f+a(i) end G=f-1/2*g if G>max max=G,a1=s,a2=t,a3=m,a4=n,a5=l; end end end end end a=[a1 a2 a3 a4 a5] b=u(5)-x(5,:)*(u(1)*a1.*x(1,:)+u(2)*a2.*x(2,:)+u(3)*a3.*x(3,:)+u(4)*a4.*x(4,:)+u(5)*a5.*x(5,:))' A=0 B=0 C=0 D=0 for h=0:.25:1 for i=1:1:5 A=A+a(i)*u(i)*x(i,2)^3 B=B+a(i)*u(i)*3*(h*x(i,1)+1)*x(i,2)^2 C=C+a(i)*u(i)*3*(h*x(i,1)+1)^2*x(i,2) D=D+a(i)*u(i)*(h*x(i,1)+1)^3 end D=D+b P=[A B C D] r=roots(P) hold on plot(h,r,'og') end
je veux l'optimiser pour l'appliquer sur une image;
merci.
On pourrait aussi savoir ce qu'est censé faire ce code ?
Commence déjà par mettre un point-virgule ";" à la fin de la plupart des lignes (sauf celles qui commences par FOR, IF ,END...) afin d'éviter que MATLAB perde du temps à afficher les résultats intermédiaires dans le Command Window
merci Dut de m'aider
J'ai mis les ";" et le temps d'exécution a bien diminué :king:mais supposons que j'utilise N points, j'aurais N boucles .Donc le problème de temps persiste toujours. Pourriez vous me donner une idée? Je serais très ravi.
Pour plus d'information,mon projet consiste a faire une classification par SVM.
SVM "support vector machine" ou bien séparteur a vaste marge :methode utilisé en traitement d'image
Vectoriser, en gros, c'est se débarasser des boucle for en traitant le vecteur (ou la matrice) dans son ensemble, plutôt que les éléments un par un.
Ce que je veux dire par vectoriser c'est comme le dit dam2227 eviter de faire le traitement élélment par élément ( matlab est fait pour le calcul matriciel)
ex :
peut s'écrire :Code:
1
2
3
4 for j=1:1:5 g=g+a(i)*a(j)*u(i)*u(j).*(x(i,:)*x(j,:)'+1)^3 end
;)Code:
1
2
3 j=[1:5]; g=g+a(i)*a(j)*u(i)*u(j).*(x(i,:)*x(j,:)'+1)^3;
Ou encore, de ça :
(solution que j'avais proposé), on passe à ça :Code:
1
2
3
4
5
6
7
8
9
10
11 x=[1 4 5 0 3 4 8 2 5 4 2]; y=[4 1 2 5 7 8 2 3 6 9 5 4 1 2 3 6 7 ]; d=zeros(1,length(y)); length(y) for i=1:length(y) if(any(x==y(i))) d(i)=y(i); end end d
Solution bien meilleure proposée par Dut. Ca, c'est de la vectorisation^^Code:
1
2
3
4 x=[1 4 5 0 3 4 8 2 5 4 2]; y=[4 1 2 5 7 8 2 3 6 9 5 4 1 2 3 6 7 ]; d=y.*ismember(y,x)
salut,j'ai compris ce que vous voulez dire par le mot "vectoriser" ,je vous remercies. j'ai essayé d'appliqué ce code:
et j'ai eu ce affichage:Code:
1
2
3 j=[1:5]; g=g+a(i)*a(j)*u(i)*u(j).*(x(i,:)*x(j,:)'+1)^3;
:bug:
donc je peux pas appliquer cette méthode.pouvez vous me donner une idée pour vectoriserCitation:
??? Error using ==> mtimes
Inner matrix dimensions must agree.
Error in ==> imp2 at 23
g=g+a(i)*a(j)*u(i)*u(j).*(x(i,: )*x(j,: )'+1)^3;
avec p très grand;Code:
1
2
3
4
5
6
7
8
9
10 for i:1:n1 for j:1:n2 for t:1:n3 .......... for s:1:np (instruction) end .... end
merci encore.
voilà une idée de départ, avec deux multiplications :
(j'ai mis les deux codes : le tien et le mien, pour que tu puisses comparer)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 g=0; a=rand(1,5); for i=1:1:5 for j=1:1:5 g=g+a(i)*a(j); end end g end x=repmat(a',1,length(a)); y=kron(a,ones(5,1)); M=x.*y; rep=sum(M(1:end))