Bonjour a tous ;
Voila mon problème , J'ai un boucle ds mon programme qui me donne une matrice P ,contient des indices de lignes et de colonnes d’une matrice A carrée symétrique d’ordre n ,soit P par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 n=9 ; P = [ 9 8 5 7 1 6 3 2 4 9 8 5 7 1 6 2 3 4 9 8 5 7 1 6 2 4 3];
Je voudrais construire une nouvelle matrice D à partir de P :
J’ai ce code :
Donc D soit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 m=size(P,1); D=zeros((n-1)*m,n); D(1:m,:)=P; r2=m+1; for r=n-1:-1:2 P(P(:,end)==r,:)=[]; if isempty(P)==1 break end P=P-((r+1)-r)*(P==r+1)+((r+1)-r)*(P==r); r1=r2-1+size(P,1); D(r2:r1,:)=P; r2=r1+1; end D(D(:,1)==0,:)=[];
Puis je cherche parmi les lignes de D et d’une autre matrice D’ « à partir de D »par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 D=[ 9 8 5 7 1 6 3 2 4 9 8 5 7 1 6 2 3 4 9 8 5 7 1 6 2 4 3 8 9 5 7 1 6 3 2 4 8 9 5 7 1 6 2 3 4 8 9 5 7 1 6 2 4 3 7 9 5 8 1 6 3 2 4 7 9 5 8 1 6 2 3 4 7 9 5 8 1 6 2 4 3 6 9 5 8 1 7 3 2 4 6 9 5 8 1 7 2 3 4 6 9 5 8 1 7 2 4 3 5 9 6 8 1 7 3 2 4 5 9 6 8 1 7 2 3 4 5 9 6 8 1 7 2 4 3 4 9 6 8 1 7 2 5 3]
Pour a=6 D’ soit :
Une ligne où la somme est plus de X1 ,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 D’= [ 9 8 5 7 1 6 4 2 3 9 8 5 7 1 6 4 3 2 9 8 5 7 1 6 3 4 2 8 9 5 7 1 6 4 2 3 8 9 5 7 1 6 4 3 2 8 9 5 7 1 6 3 4 2 7 9 5 8 1 6 4 2 3 7 9 5 8 1 6 4 3 2 7 9 5 8 1 6 3 4 2 6 9 5 8 1 7 4 2 3 6 9 5 8 1 7 4 3 2 6 9 5 8 1 7 3 4 2 5 9 6 8 1 7 4 2 3 5 9 6 8 1 7 4 3 2 5 9 6 8 1 7 3 4 2 4 9 6 8 1 7 3 5 2 ]
ie je calcule pour chaque ligne :
A(D(i,1),D(i,2))+ A(D(i,2),D(i,3))+………
Par ce code:
j’ai besoin d’un coup de main pour optimizer le code ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 X1= ? a= ? Y=zeros(1,n+1); rows = D(:,1:n-1); cols = D(:,2:n); C= sum( A( sub2ind(size(A),rows,cols) ) ,2); [~,IX]=sort(C,'descend'); rows = D(:,[1:n-a n:-1:n-a+2]); cols = D(:,[2:n-a n:-1:n-a+1]); C2= sum( A( sub2ind(size(A),rows,cols) ) ,2) ; [~,IY]=sort(C2,'descend'); if C(IX(1))>C2(IY(1)) X0=C(IX(1)); if X0>X1 X1=X0 Y=[X1 D(IX(1),:)]; end else X0=C2(IY(1)); if X0>X1 X1=X0 Y=[X1 D(IY(1),[1:n-a n:-1:n-a+1])]; end end
Quelqu’un aurait une idée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 m=size(P,1); Y=zeros(1,n+1); D=zeros(12*m,n); D(1:m,:)=P; r2=m+1; for r=n-1:-1:2 P(P(:,end)==r,:)=[]; if isempty(P)==1 break end r1=r2-1+size(P,1); P=P-((r+1)-r)*(P==r+1)+((r+1)-r)*(P==r); D(r2:r1,:)=P; r2=r1+1; end D(D(:,1)==0,:)=[]; rows = D(:,1:n-1); cols = D(:,2:n); C= sum( A( sub2ind(size(A),rows,cols) ) ,2); [~,IX]=sort(C,'descend'); rows = D(:,[1:n-a n:-1:n-a+2]); cols = D(:,[2:n-a n:-1:n-a+1]); C2= sum( A( sub2ind(size(A),rows,cols) ) ,2) ; [~,IY]=sort(C2,'descend'); if C(IX(1))>C2(IY(1)) X0=C(IX(1)); if X0>X1 X1=X0 Y=[X1 D(IX(1),:)]; end else X0=C2(IY(1)); if X0>X1 X1=X0 Y=[X1 D(IY(1),[1:n-a n:-1:n-a+1])]; end end
Merci
Partager