2013-04-19 6 views
5

में एक nother के एक सबसेट मैं तार के दो सेल सरणियों के रूप मेंजांच करें कि सेल सरणी Matlab

A={{a,b},{c},{d,e}} 
B={{a,b},{c,d},{e}} 

इस प्रकार है मैं अगर एक बी के एक सबसेट है, जिसका अर्थ है एक में प्रत्येक कोशिका है कि जाँच करना चाहते है बी में एक सुपर-सेल। दिए गए उदाहरण में यह नहीं है क्योंकि ए में {d, e} है जबकि बी में कोई सेल नहीं है जिसमें उन तत्वों का अधिक या अधिक तत्व हो। मुझे लगता है कि इस मामले में इस्मेम्बर उपयोगी होना चाहिए, लेकिन मैं तर्क को लिख नहीं पाया।

धन्यवाद!

उत्तर

4

कैसे की तरह कुछ के बारे में:

function tf = is_subset(A,B) 
    narginchk(2,2) 
    assert(iscell(A) && all(cellfun(@iscellstr,A))); 
    assert(iscell(B) && all(cellfun(@iscellstr,B))); 

    for ia=1:numel(A) 
     tf = false; 
     for ib=1:numel(B) 
      if all(ismember(A{ia},B{ib})); 
       tf = true; 
       break 
      end 
     end 
     if ~tf 
      break 
     end 
    end 
end 

साथ

[a,b,c,d,e] = deal('1','2','3','4','5'); 

A = {{a,b},{c},{d,e}}; 
B = {{a,b},{c,d},{e}}; 
is_subset(A,B)    %# false 

B = {{a,b},{c,d,e},{e}}; 
is_subset(A,B)    %# true 
+0

छोरों तोड़कर जितनी जल्दी हो सके 'cellfun' आधारित दृष्टिकोण पर एक बहुत बड़ी प्रदर्शन में सुधार करने के लिए नेतृत्व करना चाहिए (मेरे अपने सहित)। – Pursuit

+0

जादू की तरह काम करता है धन्यवाद! – Evan

2

एक, तार मान लिया जाये कि ख आदि आप निम्न कर सकता है कर रहे हैं:

बी के माध्यम से एक पाश की प्रत्येक कोशिका के लिए और देखें कि बी में एक सेल है जिसके लिए सेल में सभी तत्व सदस्य हैं। यहां एक उदाहरण दिया गया है:

A={{'abc','b'},{'c'},{'d','e'}}; 
B={{'aabc','b'},{'c','d'},{'d','e'}}; %Remove the first a to return true 


subset = true; 
for i = 1:length(A) 
    found = false; 
    for j = 1:length(B) 
     found = found || all(ismember(A{i},B{j})); 
    end 
    subset = subset && found; 
end 
subset 
+0

बहुत अच्छा काम करता है बहुत धन्यवाद – Evan

2

ए, बी, इत्यादि के प्रकार क्या हैं? यदि वे तार हैं, तो आप यह जांचने के लिए setdiff का उपयोग कर सकते हैं कि एक सेट दूसरे के भीतर है या नहीं। cellfun और any या all का उचित उपयोग करना चाहिए। इस तरह:

all(cellfun(@(a)any(cellfun(@(b)isempty(setdiff(a,b)),B)),A)) 

यदि वे किसी अन्य प्रकार के हैं, तो आप एक सुपर-सेल की जांच के लिए एक साधारण एम-फाइल बना सकते हैं। इस फ़ंक्शन पर कॉल के साथ isempty(setdiff(a,b)) बदलें। इसे a के तत्वों के माध्यम से लूप करना होगा और प्रत्येक के लिए जांच करें कि यह b में मौजूद है या नहीं।

+0

धन्यवाद आपका कोड काम कर रहा है लेकिन मुझे समझ में नहीं आया .. क्या आप इसे संक्षिप्त रूप से प्रकट कर सकते हैं? – Evan

+0

'छूट (setdiff (ए, बी)) 'जांचता है कि' बी' 'ए' का सुपरसेट है या नहीं। दो सेलफन 'ए' और' बी' के तत्वों पर चलते हैं। अंतिम परिणाम सही है अगर 'ए' के सभी तत्वों को' बी 'का कम से कम एक तत्व मिल सकता है जो एक सुपरसेट है। – nhowe

7

को देखते हुए ए और बी

A={{'a','b'},{'c'},{'d','e'}} 
B={{'a','b'},{'c','d'},{'e'}} 

हम एक समारोह isSubset परिभाषित कर सकते हैं, इस प्रकार है:

isSubset = @(superSet,subSet)isempty(setdiff(subSet, superSet)); 

और यह परीक्षण:

isSubset(B{1}, A{1}) %true 
isSubset(B{2}, A{2}) %true 
isSubset(B{3}, A{3}) %false 

अब हम उपयोग कर सकते हैं isSubSet और

isSubSetOfAny = @(superSetSet, subSet) any(cellfun(@(x)isSubset(x, subSet), superSetSet)); 

और यह परीक्षण:

isSubSetOfAny(B, A{1}) %True 
isSubSetOfAny(B, A{2}) %True 
isSubSetOfAny(B, A{3}) %True 

एक समारोह isSubSetOfAny है, जो अगर कोई खास सबसेट सेट का एक सेट में से किसी का एक सबसेट है देखते हैं, इस तरह के जांच करता है परिभाषित करने के लिए अब हम isSubSetOfAny प्लस cellfun (दोबारा) isEachMemberASubsetOfAny को परिभाषित करने के लिए उपयोग कर सकते हैं, जो आपके द्वारा वर्णित ऑपरेशन करता है:

isEachMemberASubsetOfAny = @(superSetSet, subSetSet) all(cellfun(@(x)isSubSetOfAny(superSetSet, x), subSetSet)); 

और यह परीक्षण:

isEachMemberASubsetOfAny(B, A) %Returns false 

A_1 = {{'a','b'},{'c'},{'e'}}; %Define a variant of `A` 
isEachMemberASubsetOfAny(B, A_1) %Returns false 
+0

+1 अच्छी तरह से समझाया गया कदम-दर-चरण – Amro

+0

बहुत उपयोगी धन्यवाद! – Evan

संबंधित मुद्दे