2013-04-02 20 views
6

mam (7,6) logiczny układ, taki jak:Znalezienie wektora w obrębie wektora

validY2_A =

0  0  0  0  0  0 
0  0  0  0  0  0 
0  0  0  1  0  0 
1  0  0  1  1  0 
1  1  1  0  0  1 
1  1  1  0  1  1 
0  1  1  1  1  1 

że chce utworzyć grupę (1,6) logiczny wektor 'contig', który pokazuje, czy powyższa macierz ma 3 sąsiadujące w każdej kolumnie. Na przykład, wynik ten byłby:

wynajęcia =

[1, 1, 1, 0, 0 ,1]; 

Próbowałem strfind ale istnieją dwa problemy z tym, pierwszym jest to, iż jest tablicą kolumn (transpozycji albo didn W ogóle nie pomoże lub wymagałoby użycia dodatkowego kodu do tymczasowego użycia. Drugą kwestią jest to, że ponieważ jest to tablica logiczna, jeśli zmienię ją na ciąg znaków, wszystkie wartości stają się prawdziwe lub fałszywe i próbują je uzyskać do pracy jest również bezowocne.Czy istnieje metoda wyszukiwania wektora kolumna, aby znaleźć inny, specyficzny wektor kolumna istnieje w dowolnym miejscu w nim? Chcę przeszukać każdą kolumnę dla [1; 1; 1];

Dzięki

Odpowiedz

5

Jak o

t = imfilter(validY2_A, ones(3,1)); 
contig = any(t >= 3, 1); 

Alternatywnie (jak sugeruje @Dan):

t = conv2(validY2_A, ones(3,1), 'same'); 
contig = any(t >= 3, 1); 

Jak sugeruje @GeorgeAprilis, można trzeba konwertować matrycy logicznej validY2_A podwoić pierwszy :

validY2_A = double(validY2_A); 
+3

+1, ale powinien zastąpić 'imfilter' z' conv2', ponieważ może nie mieć dostępu do narzędzia do przetwarzania obrazu – Dan

+1

bardzo ładne podejście z 'imfilter'. Jeśli 'validY2_A' jest macierzą logiczną, to aby działać, musi zostać przekonwertowane na double first, w przeciwnym razie' t' jest również macierzą logiczną. Podczas testowania musiałem zmienić to na: 't = imfilter (double (validY2_A), ones (3,1));' –

+0

Dziękuję bardzo, ale czy możesz wyjaśnić, co dokładnie robi conv2 lub imfilter? Patrzę na matrycę t i nie rozumiem, co się dzieje i jak powstają obliczenia wynikowe. – TheMcCleaver

2

tutaj to sposób, który powinien być łatwy do zrozumienia:

idx1=1:end-2 
idx2=2:end-1 
idx3=3:end 

Zasadniczo te indeksy przesuwają macierz trzy razy.

Teraz wystarczy je zastosować:

any(validY2_A(idx1,:) & validY2_A(idx2,:) & validY2_A(idx3,:)) 

To nie jest zbyt trudno uogólniać za pomocą pętli i przesunięcie funkcji dla przykładu.

+0

Wow interesujące podejście – Justin