Bonjour,
On peut travailler avec les indices trouvés.
Bonsoir,
j'ai pas compris càd pas besoin de uniques ou pas besoin du tableau ?
en fait, je vais appliquer l'entropie à chaque bloc(sous matrice) donc c'est plus facile d'utiliser un tableau
autre chose
est ce que je peux automatiser l'accès à la matrice
en effet j'ai un dossier qui contient plusieurs matrice sur mon bureau et je dois faire l'extraction de sous matrices pour toutes les matrices dans le dossier je veux que l'accès à la matrice soit automatique
et si je pourrai stocker toutes les sous matrice dans un même tableau (ou bien juste des parties car c'est volumineux )
merci infiniment d'avance pour toute réponse
Malheureusement j'ai pris un échantillon quelconque de sous matrice et j'ai testé j'ai trouvé une sous matrice de 1 au lieu de 0 ! donc le test n'a pas fonctionné !?, du coup n'est il pas mieux de tester la somme des éléments des sous matrices pour avoir de bon résultat càd faire une boucle qui extrait des sous matrices(smat) tel que sum(sum(mat))==dx*dy qui puisse m'aider à faire ça en matlab bon j'ai essyé le code suivant mais c'était pas bon merci pour tout aide et toute correction :
fonction principale
fonction inters
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 clear [IL,JC]=size(M); MM=num2str(M);% Conversion en caractères dx=70;dy=70;% Dimensions de la matrice de zéros recherchée dx : colonnes dy : lignes for n=1:IL r=strfind(MM(n,:), num2str(sum(sum(MM(n,:))==0')));% Recherche des chaînes de caractères candidates T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée end resu=inters(T,dy);% Fonction de calcul des zones disp(['Il y a : ' num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) ' Col x ' num2str(dy) ' Lig']) disp(' '); [I,J,V]=find(resu);% calcul des indices for k=1:JC VC(k)=V(k)-2*(V(k)-1)/3; %disp(['B : ' num2str(k) ' (' num2str(I(k)+200) ':' num2str(VC(k)+200) ')'... % ' (' num2str(I(k)+dy-1+200) ':' num2str(VC(k)+dx-1+200) ')' ]); %disp(M(I(k):I(k)+dy-1,VC(k):VC(k)+dx-1)); disp(' '); TR(k+1,1)=[k]; TR(k+1,2)=[I(k)]; TR(k+1,3)=[I(k)+dy-1]; TR(k+1,4)=[VC(k)]; TR(k+1,5)=[VC(k)+dx-1]; end TR
merci d'avance pour toute aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function res=inters(T,dy) res=size(T,1)*size(T,2); for n=1:length(T)-dy v=T(n,:); for p=n+1:dy+n-1 v=intersect(v,T(p,:)); end res(n,1:length(v))=v; end
Bonjour,
Pour tester si les sous-matrices sont jointes, peux utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 clear W=3;H=5;% Largeur et Hauteur r1=[6, 5, W, H]; r2=[3, 3, W, H]; r3=[5, 7, W, H]; %Tracé des rectangles rectangle('Position',r1) rectangle('Position',r2) rectangle('Position',r3) axis([ 0 15 0 15]); % Tests d'intersection : 0 = disjoints et 1 = joints (calcul de la surface I12=rectint(r1, r2) I13=rectint(r1, r3) I23=rectint(r2, r3)
bonjour, et merci
comme mentionné dessus(dans mon message) le programme ne donne pas toujours des 0 purs donc n'est il pas mieux de tester la somme des éléments des sous matrices pour avoir de bon résultat càd faire une boucle qui extrait des sous matrices(smat) tel que sum(sum(smat))==dx*dy (càd si on a dx=4 et dy=4 alors si la sous matrice contient des 1 seulement sum(sum(smat))=16 si elle contient que des 0 sum(sum(smat))=0)
Pourriez vous m'aider SVP à faire ça en matlab bon j'ai essayé le code suivant mais c'était pas bon merci pour tout aide et toute correction :
fonction principale
fonction inters :
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 clear [IL,JC]=size(M); MM=num2str(M);% Conversion en caractères dx=70;dy=70;% Dimensions de la matrice de zéros recherchée dx : colonnes dy : lignes for n=1:IL r=strfind(MM(n,:), num2str(sum(sum(MM(n,:))==0')));% Recherche des chaînes de caractères candidates T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée end resu=inters(T,dy);% Fonction de calcul des zones disp(['Il y a : ' num2str(nnz(resu)) ' zone(s) de zéros de cotés : ' num2str(dx) ' Col x ' num2str(dy) ' Lig']) disp(' '); [I,J,V]=find(resu);% calcul des indices for k=1:JC VC(k)=V(k)-2*(V(k)-1)/3; %disp(['B : ' num2str(k) ' (' num2str(I(k)+200) ':' num2str(VC(k)+200) ')'... % ' (' num2str(I(k)+dy-1+200) ':' num2str(VC(k)+dx-1+200) ')' ]); %disp(M(I(k):I(k)+dy-1,VC(k):VC(k)+dx-1)); disp(' '); TR(k+1,1)=[k]; TR(k+1,2)=[I(k)]; TR(k+1,3)=[I(k)+dy-1]; TR(k+1,4)=[VC(k)]; TR(k+1,5)=[VC(k)+dx-1]; end TR
et merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function res=inters(T,dy) res=size(T,1)*size(T,2); for n=1:length(T)-dy v=T(n,:); for p=n+1:dy+n-1 v=intersect(v,T(p,:)); end res(n,1:length(v))=v; end
Bonjour,
Ta modif ne convient pas.
Tu peux essayer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for n=1:IL %r=strfind(MM(n,:), num2str(sum(sum(MM(n,:))==0')));% Recherche des chaînes de caractères candidates r=strfind(MM(n,:), num2str(zeros(dx,1)'));% Recherche des chaînes de caractères candidates T(n,1:length(r))=r;% Rang des colonnes avec chaîne recherchée end
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 %for k=1:JC for k=1:length(I) VC(k)=V(k)-2*(V(k)-1)/3; if nnz([M(I(k):I(k)+dy-1,VC(k):VC(k)+dx-1)])~=0 erreur=erreur+1; k=k+1; break end disp(['B : ' num2str(k) ' (' num2str(I(k)+200) ':' num2str(VC(k)+200) ')'... ' (' num2str(I(k)+dy-1+200) ':' num2str(VC(k)+dx-1+200) ')' ]); disp(M(I(k):I(k)+dy-1,VC(k):VC(k)+dx-1)); disp(' '); TR(k+1,1)=[k]; TR(k+1,2)=[I(k)]; TR(k+1,3)=[I(k)+dy-1]; TR(k+1,4)=[VC(k)]; TR(k+1,5)=[VC(k)+dx-1]; end TR
bonjour,
pourquoi ?
est ce n'est pas plus simple de chercher les matrices dont sum(sum(mat))==0 pour les matrices contenant juste des 0 et sum(sum(mat))==dx*dy pour les matrices contenant des 1 seulement ?
plus d'explication s'il vous plait
en plus le code qu vous m'avez donné dessus donne le message d'erreur suivant :
merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Warning: Integer operands are required for colon operator when used as index > In fonction1 (line 26) Index exceeds matrix dimensions. Error in fonction1 (line 27) if nnz([M(I(k):I(k)+dy-1,VC(k):VC(k)+dx-1)])~=0
Bonjour,
Tu as raison tu peux supprimer le break.
bonjour phryte merci pour la réponse
mais avez vous de réponse sur ce qui suit s'il vous plait ?
est ce n'est pas plus simple de chercher les matrices dont sum(sum(mat))==0 pour les matrices contenant juste des 0 et sum(sum(mat))==dx*dy pour les matrices contenant des 1 seulement ?
si oui pourriez vous m'aider à faire cela ou à modifier le programme de cette manière ?
j'ai essayé de nouveau votre programme(il fonctionne correctement sur une matrice de petite taille )mais et il ne fonctionne pas correctement sur ma matrice j'ai pris des indices au hazard et le résultat était le suivant :
il ya un petit 1 enfin ! donc le programme ne fonctionne pas correctement ! dommage :'( essayez de m'aider sur l'idée que j'ai mentionné dessus peut être le programme sera meilleur SVP et merci infiniment d'avance pour toute réponse
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 mat(402:421,418:437) ans = Columns 1 through 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Columns 19 through 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
Bonjour,
Un essai avec la force brute :
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 clear M =[0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0]; [IL,JC]=size(M); MM=num2str(M);% Conversion en caractères dx=4;dy=2;% Dimensions de la matrice de zéros recherchée dx : colonnes dy : lignes MR=zeros(dy,dx); TR=[0,0,0,0,0]; num=0; for nl=1:IL-dy+1 for nc=1:JC-dx+1 if M(nl:nl+dy-1,nc:nc+dx-1)==MR num=num+1; TR=[TR;num,nl,nl+dy-1,nc,nc+dx-1]; end end end
Bonjour,
La force brute signifie que le programme analyse tous les cas possibles (donc y compris les redondances) et il est donc plus long en temps de calcul (surtout lorsque l'on a des matrices très grandes, on appelle cela une explosion combinatoire !).
Il faut donc rechercher des algorithmes plus performants. C'est ce que j'ai essayer de faire dans la première version.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager