Czy ktos by mi pomogl z tym zadaniem? Dostalismy takie zadanie bez zadnej pomocy nauczycielka.. Porazka
cepoo napisał(a):
Czy ktos by mi pomogl z tym zadaniem? Dostalismy takie zadanie bez zadnej pomocy nauczycielka.. Porazka
Nie pamiętam już składni matlaba, ale coś takiego myślę:
kwadraty = 0
for( x =0; x<dlugosc_macierzy-2; x++)
for(y=0; y < szerokosc_macierzy-2; y++)
if( a[x,y] == a [x,y+1] == a[x+1,y] == a[x+1,y+1] == 1 )
kwadraty++;
Pewnie jest na to jakiś mądrzejszy sposób, ale tak na szybko wymyśliłem.
Ja tam w drugiej macierzy widzę cztery kwadraty...
Anyway...
Jeśli przeszukiwana macierz zawiera tylko zera i jedynki to dowolny wzorzec najłatwiej znajdziesz przy pomocy splotu (lub korelacji).
Nie jest to też specjalnie szybkie rozwiązanie (czyli nie próbowałbym go używać dla bardzo dużych macierzy - nie pamiętam czy
conv2 albo xcorr2 mają optymalizację dla sparse matrices).
octave:2> a=[1 0 0 0 0; 0 0 0 1 0; 0 0 0 0 1; 0 0 0 0 1; 0 0 1 0 0]
a =
1 0 0 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 1
0 0 1 0 0
octave:3> b=[1 0 1 0; 0 0 1 0; 1 1 1 1; 0 1 1 1]
b =
1 0 1 0
0 0 1 0
1 1 1 1
0 1 1 1
octave:4> c1=[1 1;1 1]
c1 =
1 1
1 1
octave:5> c2 = [ 1 0 1; 0 0 0; 1 0 1]
c2 =
1 0 1
0 0 0
1 0 1
octave:6> c3 = [0 1 0; 1 0 1; 0 1 0]
c3 =
0 1 0
1 0 1
0 1 0
% itd dla każdego wzorca który chcesz znaleźć
Potem liczysz dwuwymiarowy splot macierzy (albo dwuwymiarową korelację) z poszukiwanymi kwadratami i sprawdzasz ile razy w wyniku pojawiła się wartość 4 (czyli liczba jedynek we wzorcu).
octave:36> conv2(a, c1)
ans =
1 1 0 0 0 0
1 1 0 1 1 0
0 0 0 1 2 1
0 0 0 0 2 2
0 0 1 1 1 1
0 0 1 1 0 0
octave:37> conv2(b, c1)
ans =
1 1 1 1 0
1 1 2 2 0
1 2 3 3 1
1 3 4 4 2
0 1 2 2 1
Liczbę "czwórek" możesz łatwo policzyć wyrażeniem
sum(sum(conv2 (b, c3)==4))
Funkcję conv2 możesz zamienić na xcorr2