5

我有两个字符串单元数组,如下所示

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

我想检查 A 是否是 B 的子集,这意味着 A 中的每个单元格在 B 中都有一个超级单元格。在给定的示例中,它不是因为 A 包含 {d,e} 而 B 没有任何具有那些或更多的元素。我认为 ismember 在这种情况下应该很有用,但我就是无法写下逻辑。

谢谢!

4

4 回答 4

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

现在我们可以使用isSubSetandcellfun来定义一个函数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

现在我们可以使用isSubSetOfAnyplus 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
于 2013-04-19T20:45:45.187 回答
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
于 2013-04-19T20:33:34.177 回答
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
于 2013-04-19T20:36:45.923 回答
2

a、b等有哪些类型?如果它们是字符串,您可以使用它setdiff来测试一个集合是否包含在另一个集合中。适当使用cellfunanyall应该这样做。像这样:

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

如果它们是其他类型,您可以制作一个简单的 m 文件来检查超级单元。替换isempty(setdiff(a,b))为对此函数的调用。它将必须遍历 的元素a并检查每个元素是否存在于b.

于 2013-04-19T20:38:33.140 回答