Biorąc A i B
A={{'a','b'},{'c'},{'d','e'}}
B={{'a','b'},{'c','d'},{'e'}}
możemy zdefiniować funkcję isSubset
, co następuje:
isSubset = @(superSet,subSet)isempty(setdiff(subSet, superSet));
i przetestować go:
isSubset(B{1}, A{1}) %true
isSubset(B{2}, A{2}) %true
isSubset(B{3}, A{3}) %false
Teraz możemy użyć isSubSet
i cellfun
zdefiniować funkcję isSubSetOfAny
, który sprawdza, czy dany podzbiór jest podzbiorem zbioru zestawów, jak to:
isSubSetOfAny = @(superSetSet, subSet) any(cellfun(@(x)isSubset(x, subSet), superSetSet));
i przetestować go:
isSubSetOfAny(B, A{1}) %True
isSubSetOfAny(B, A{2}) %True
isSubSetOfAny(B, A{3}) %True
Teraz możemy użyć isSubSetOfAny
oraz cellfun
(ponownie), aby zdefiniować isEachMemberASubsetOfAny
, który wykonuje operację, którą opisujesz:
isEachMemberASubsetOfAny = @(superSetSet, subSetSet) all(cellfun(@(x)isSubSetOfAny(superSetSet, x), subSetSet));
i przetestować go:
isEachMemberASubsetOfAny(B, A) %Returns false
A_1 = {{'a','b'},{'c'},{'e'}}; %Define a variant of `A`
isEachMemberASubsetOfAny(B, A_1) %Returns false
Przełamując pętle jak najszybciej powinno prowadzić do dość dużej poprawy osiąganych przez 'podejść opartych cellfun' (w tym moje własne). – Pursuit
działa jak magia dziękuję! – Evan