Với A và B
A={{'a','b'},{'c'},{'d','e'}}
B={{'a','b'},{'c','d'},{'e'}}
Chúng ta có thể định nghĩa một hàm isSubset
, như sau:
isSubset = @(superSet,subSet)isempty(setdiff(subSet, superSet));
Và kiểm tra nó:
isSubset(B{1}, A{1}) %true
isSubset(B{2}, A{2}) %true
isSubset(B{3}, A{3}) %false
Bây giờ chúng ta có thể sử dụng isSubSet
và cellfun
để xác định một hàm isSubSetOfAny
, mà sẽ kiểm tra xem một tập hợp con đặc biệt là một tập hợp con của bất kỳ một tập hợp các bộ, như thế này:
isSubSetOfAny = @(superSetSet, subSet) any(cellfun(@(x)isSubset(x, subSet), superSetSet));
Và kiểm tra nó:
isSubSetOfAny(B, A{1}) %True
isSubSetOfAny(B, A{2}) %True
isSubSetOfAny(B, A{3}) %True
Bây giờ chúng tôi có thể sử dụng isSubSetOfAny
cộng cellfun
(một lần nữa) để xác định isEachMemberASubsetOfAny
, thực hiện thao tác bạn mô tả:
isEachMemberASubsetOfAny = @(superSetSet, subSetSet) all(cellfun(@(x)isSubSetOfAny(superSetSet, x), subSetSet));
Và kiểm tra nó:
isEachMemberASubsetOfAny(B, A) %Returns false
A_1 = {{'a','b'},{'c'},{'e'}}; %Define a variant of `A`
isEachMemberASubsetOfAny(B, A_1) %Returns false
Phá vỡ vòng càng sớm càng tốt sẽ dẫn đến một sự cải thiện hiệu suất khá lớn so với 'cách tiếp cận dựa cellfun' (bao gồm cả của riêng tôi). – Pursuit
hoạt động giống như ma thuật cảm ơn bạn! – Evan