2012-05-09 16 views
11

में मेल खाने वाली पंक्तियों को ढूंढना मान लीजिए मेरे पास एक (एम एक्स एन) मैट्रिक्स क्यू है, और एक पंक्ति वेक्टर आर, उदा।मैट्रिक्स

Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ]; 

r = [ 1 2 3 ]; 

निर्दिष्ट पंक्ति आर (सभी तत्वों के लिए) इंगित करता है कि क्यू में पंक्तियों की जो समान हैं एक तार्किक (लंबाई मीटर की) वेक्टर प्राप्त करने के लिए सबसे आसान तरीका क्या है?

ऊपर नमूना मामले में, कि

[ 1 0 0 1 1 0 ]; 
+0

बहुत करीब से संबंधित: http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

उत्तर

19

आप ismember का उपयोग करें और यह कर सकते हैं एक पंक्ति में:

>> ismember(Q,r,'rows')' 

ans = 

    1  0  0  1  1  0 
13
all(bsxfun(@eq, r, Q),2)' 

bsxfun(@eq, r, Q) होना चाहिए प्रत्येक पंक्ति तुलना और क्यू के रूप में एक ही आकार के साथ एक मैट्रिक्स रिटर्न:

>> bsxfun(@eq, r, Q) 

ans = 

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

all समारोह यदि गणना करता है bsxfun का परिणाम प्रत्येक पंक्ति के साथ अलग-अलग सत्य है। इस प्रकार यह रिटर्न:

>> all(ans,2)' 

ans = 

    1  0  0  1  1  0 

और हाँ, वहाँ भी एक पक्षांतरित ऑपरेटर ' अपने वांछित पंक्ति उत्पादन मैच के लिए है

+1

यह ध्यान देने योग्य है कि यह –

0
repmat साथ

आसान तरीका:

a = [1 2 3; 4 5 6; 7 8 9]; 
t = [4 5 6]; 
[x,y] = size(a); 
r = all(a==repmat(t,y,1), 2)' 
+0

की तुलना में काफी तेज है, यह भी कम कुशल और धीमी है, देखें: http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

क्षमता जहां इसकी आवश्यकता नहीं है एक शाप है। लिखने और समझने की सरलता सीधे बेहतर कोड से संबंधित है। – Castilho

+0

'bsxfun (@eq, r, Q) 'के बारे में क्या समझना मुश्किल है ?? यदि आप इसे आसान उदाहरणों से सीखते हैं, तो जटिल समस्याओं पर आवेदन करते समय आपको इससे फायदा होता है .. –

1
a = [1 1 1; 2 2 2; 3 3 3]; 
b = a(1:2,;); 
[temp locb] = ismember(a,b,'rows'); 
b(locb(locb~=0),:) 

ans = 

    1  1  1 
    2  2  2