Bonjour,
Je souhaite calculer à partir d'une matrice ne contenant que des 0 et des 1, une carte de même dimension que ma matrice initiale et qui pour chaque case me donne le volume des cases connectées à celle-ci.
Par exemple, la matrice
me donnerait la carte suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 a=[0 0 0 0 0 0 0 0; 0 0 0 0 0 1 1 0 ; 0 1 0 0 0 0 1 0; 0 0 1 1 0 1 1 0; 0 0 1 1 1 0 0 0; 0 0 1 1 1 0 0 0; 0 0 1 0 0 0 0 0; 0 0 0 0 0 0 0 0;];
Pour l'obtenir, j'ai réalisé le code suivant (c'est bourrin ,j'ai lu qu'il fallait éviter les boucles en matlab, mais je n'ai pas su faire autrement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 k=[0 0 0 0 0 0 0 0; 0 0 0 0 0 5 5 0 ; 0 1 0 0 0 0 5 0; 0 0 9 9 0 5 5 0; 0 0 9 9 9 0 0 0; 0 0 9 9 9 0 0 0; 0 0 9 0 0 0 0 0; 0 0 0 0 0 0 0 0;];
Mon idée est la suivante : je me place sur la case de coordonnées (m,n) , avec a(m,n)=1 et ensuite je parcours dans chaque direction les cases adjacentes qui valent 1. Pour chaque case visitée, je fais passer le marqueur s à 1 pour ne pas passer plusieurs fois la même case. Puis je dis que la norme de mon vecteur s est le nombre de case que j'ai parcouru.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 a=[0 0 0 0 0 0 0 0; 0 0 0 0 0 1 1 0 ; 0 1 0 0 0 0 1 0; 0 0 1 1 0 1 1 0; 0 0 1 1 1 0 0 0; 0 0 1 1 1 0 0 0; 0 0 1 0 0 0 0 0; 0 0 0 0 0 0 0 0;]; k=zeros(8,8); for x=2:7; for y=2:7; %calcul de k(x,y) for i=x:-1:2; t=zeros(1,8); for j=y:-1:2; s=zeros(1,8); if ((a(i,j)==1 & a(i,j-1)==1)); s(j)=1; elseif ((a(i,j)==1 & a(i,j-1)==0) & ((a(i-1,j)==1) | (a(i+1,j)==1 ))); s(j)=1; else s(j)=0; t(i)=norm(s); end; end; for j=y+1:7; s=zeros(1,8); if ((a(i,j)==1 & a(i,j+1)==1) ); s(j)=1; elseif ((a(i,j)==1 & a(i,j+1)==0) & ((a(i-1,j)==1) | (a(i+1,j)==1 ))); s(j)=1; else s(j)=0; t(i)=t(i)+norm(s); end; end; k(x,y)=norm(t); end; for i=x+1:7; t=zeros(1,8); for j=y:-1:2; s=zeros(1,8); if ((a(i,j)==1 & a(i,j-1)==1)); s(j)=1; elseif ((a(i,j)==1 & a(i,j-1)==0) & ((a(i-1,j)==1) | (a(i+1,j)==1 ))); s(j)=1; else s(j)=0; t(i)=norm(s); end; end; for j=y+1:7; s=zeros(1,8); if ((a(i,j)==1 & a(i,j+1)==1) ); s(j)=1; elseif ((a(i,j)==1 & a(i,j+1)==0) & ((a(i-1,j)==1) | (a(i+1,j)==1 ))); s(j)=1; else s(j)=0; t(i)=t(i)+norm(s); end; end; k(x,y)=k(x,y)+norm(t); end; end; end;
Cependant , la matrice k retournée est nulle, comme si les if n'étaient jamais vérifiés. (en plus j'ai l'impression que certaines cases ne seront jamais visitées).
J'ai essayé d'autres méthodes, en utilisant le vecteur find(a) et l'indexation linéaire mais à chaque fois je considère un cas pathologique, j'obtiens pas le résultat souhaité.
Donc, je voulais savoir :
-(sait-on jamais :rêve: ) une fonction permettrait elle d'obtenir ce que je souhaite (ou m'aider) ?
- puis-je obtenir ma carte k avec ce type de méthode, ou est-ce que je dois envisager la concept d'un arbre ou de file ?
Merci d'avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part version 6.5.0.180913a (R13)
Partager