我有两个字符串的单元格数组如下
A={{a,b},{c},{d,e}}
B={{a,b},{c,d},{e}}
我想检查A是否是B的子集,这意味着A中的每个单元都有一个B中的超级单元。在给定的例子中,它不是因为A包含{d,e}而B没有任何具有那些或更多元素的单元格。 我认为ismember在这种情况下应该是有用的,但我不能写下逻辑。
谢谢!
答案 0 :(得分:7)
给出A和B
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
和cellfun
来定义函数isSubSetOfAny
,它会检查特定子集是否是任何集合的子集,如下所示:
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
加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
答案 1 :(得分: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
答案 2 :(得分:2)
假设a,b等是字符串,您可以执行以下操作:
对于A循环到B的每个单元格,并查看B中是否存在单元格中所有元素都是成员的单元格。这是一个例子:
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
答案 3 :(得分:2)
a,b等有哪些类型?如果它们是字符串,您可以使用setdiff
来测试一个集合是否包含在另一个集合中。 cellfun
和any
或all
的合适用途应该是这样做的。像这样:
all(cellfun(@(a)any(cellfun(@(b)isempty(setdiff(a,b)),B)),A))
如果它们是其他类型,您可以创建一个简单的m文件来检查超级单元格。通过调用此函数替换isempty(setdiff(a,b))
。它必须循环遍历a
的元素并检查每个元素是否存在于b
中。