2013-04-02 13 views
6

मैं निम्नलिखित जैसे एक (7,6) तार्किक सरणी, है:एक वेक्टर के भीतर एक वेक्टर ढूँढना

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 

मैं एक (1,6) तार्किक वेक्टर बनाना चाहते हैं 'contig' जो दिखाता है कि उपरोक्त मैट्रिक्स में प्रत्येक कॉलम में 3 संगत हैं या नहीं। उदाहरण के लिए, इस के परिणाम होगा:

contig =

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

मैं strfind की कोशिश की है लेकिन इस के साथ दो मुद्दे हैं, पहले की जा रही है कि यह कॉलम की एक सरणी है (transposing या तो didn मदद नहीं करता है या अस्थायी रूप से उपयोग करने के लिए बहुत सारे अतिरिक्त कोड की आवश्यकता होगी। दूसरी समस्या यह है कि क्योंकि यह एक तार्किक सरणी है, अगर मैं इसे एक स्ट्रिंग में बदलता हूं, तो मान सभी सत्य या गलत हो जाते हैं, और इसे प्राप्त करने का प्रयास करते हैं काम करने के लिए भी फलहीन है। क्या कोई अन्य कॉलम वेक्टर खोजने के लिए कोई तरीका है, यह पता लगाने के लिए कि कोई अन्य, विशिष्ट कॉलम वेक्टर इसके भीतर कहीं भी मौजूद है? मैं प्रत्येक कॉलम को [1; 1; 1];

के लिए खोजना चाहता हूं

धन्यवाद

उत्तर

5

कैसे

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

वैकल्पिक रूप से (के रूप में @Dan ने सुझाव दिया) के बारे में:

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

@GeorgeAprilis ने सुझाव दिया के रूप में, एक पहले दोगुना करने के लिए तार्किक मैट्रिक्स validY2_A कन्वर्ट करने के लिए आवश्यकता हो सकती है :

validY2_A = double(validY2_A); 
+3

+1 लेकिन 'imfilter' को' conv2' के साथ प्रतिस्थापित करना चाहिए क्योंकि छवि प्रसंस्करण टूलबॉक्स – Dan

+1

'imfilter' के साथ बहुत अच्छा दृष्टिकोण नहीं हो सकता है। यदि 'validY2_A' एक तार्किक मैट्रिक्स है, तो काम करने के लिए इसे पहले डबल में परिवर्तित करने की आवश्यकता है, अन्यथा' t' एक तार्किक मैट्रिक्स भी है। इसका परीक्षण करते समय मुझे इसे बदलने की आवश्यकता थी: 't = imfilter (डबल (validY2_A), वाले (3,1));' –

+0

आपको बहुत धन्यवाद, यद्यपि आप कृपया बता सकते हैं कि या तो conv2 या imfilter क्या करता है? मैं मैट्रिक्स टी देख रहा हूं और मुझे समझ में नहीं आता कि क्या हो रहा है और परिणामस्वरूप गणना कैसे की जाती है। – TheMcCleaver

2

यहां एक तरीका है जिसे समझना आसान होना चाहिए:

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

मूल रूप से ये अनुक्रमणिका आपके मैट्रिक्स को तीन बार स्थानांतरित करती हैं।

अब तुम सिर्फ उन्हें लागू होते हैं:

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

यह एक पाश का उपयोग कर सामान्य और उदाहरण के लिए समारोह शिफ्ट करने के लिए बहुत कठिन नहीं है।

+0

वाह दिलचस्प दृष्टिकोण – Justin