5

次のように、文字列のセル配列が 2 つあります。

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

A が B のサブセットであるかどうか、つまり、A の各セルが B にスーパーセルを持っているかどうかを確認したいのですが、この例では、A には {d,e} が含まれているのに対し、B には次のセルがないため、そうではありません。それらまたはそれ以上の要素。この場合は ismember が役立つと思いますが、ロジックを書き留めることができませんでした。

ありがとうございました!

4

4 に答える 4

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あるセットが別のセットに含まれているかどうかをテストするために使用できます。cellfunand anyorの適切な使用は、それallを行う必要があります。そのようです:

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 に答える