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 :

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,:)=[];
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
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]
 Puis je cherche parmi les lignes de D et d’une autre matrice D’ « à partir de D »par exemple :

Pour a=6 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
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  ]
Une ligne où la somme est plus de X1 ,
ie je calcule pour chaque ligne :
A(D(i,1),D(i,2))+ A(D(i,2),D(i,3))+………
Par ce 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
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
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
Quelqu’un aurait une idée ?
Merci