2013-04-02 34 views
6

ho un (7,6) array logico, come il seguente:Trovare un vettore all'interno di un vettore

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 

voglio creare una (1,6) vettore logico 'contig' che mostra se la matrice precedente ha 3 contigue in ogni colonna. Ad esempio, il risultato di questo sarebbe:

contig =

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

Ho provato strfind ma ci sono due problemi con questo, il primo è che è un array di colonne (trasposizione sia didn non è affatto d'aiuto o richiederebbe un sacco di codice aggiuntivo da utilizzare temporaneamente.Il secondo problema è che poiché è un array logico, se lo cambio in una stringa, i valori diventano tutti veri o falsi e cercano di ottenerlo Anche lavorare è stato infruttuoso: esiste un metodo per cercare un vettore di colonne per scoprire se esiste un altro vettore di colonna specifico all'interno di esso? Voglio cercare ogni colonna per [1; 1; 1];

Grazie

risposta

5

Come su

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

alternativa (come suggerito da @ Dan):

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

Come suggerito da @GeorgeAprilis, uno potrebbe essere necessario per convertire la matrice logica validY2_A a raddoppiare prima :

validY2_A = double(validY2_A); 
+3

+1 ma dovrebbe sostituire 'imfilter' con' conv2' in quanto potrebbe non avere accesso alla casella degli strumenti di elaborazione delle immagini – Dan

+1

approccio molto carino con 'imfilter'. Se 'validY2_A' è una matrice logica, per funzionare ha bisogno di essere convertita in doppia prima, altrimenti' t' è anche una matrice logica. Durante il test ho dovuto cambiarlo con questo: 't = imfilter (double (validY2_A), ones (3,1));' –

+0

Grazie mille, anche se puoi spiegare esattamente cosa fa conv2 o imfilter? Sto osservando la matrice t e non capisco cosa sta succedendo e come vengono effettuati i calcoli risultanti. – TheMcCleaver

2

Qui è un modo che dovrebbe essere facile da capire:

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

Fondamentalmente questi indici spostano la matrice tre volte.

Ora basta applicarle:

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

Questo non è troppo difficile generalizzare utilizzando un ciclo e la funzione di spostare, per esempio.

+0

Wow approccio interessante – Justin

Problemi correlati