Для связанного сообщения вы можете сформировать матрицу s
, которая представляет количество похожих элементов между всеми парами наборов. Результатом будет:
C = {[1,2,3,4], [3,4], [2], [4,5,6], [4,5], [7]};
n = cellfun(@numel,C); % find length of each element.
v = repelem(1:numel(C),n); % generate indices for rows of the binary matrix
[~,~,u] = unique([C{:}]); % generate indices for rows of the binary matrix
b = accumarray([v(:),u(:)],ones(size(v)),[],@max,[],true); % generate the binary matrix
s = b * b.'; % multiply by its transpose
s(1:size(s,1)+1:end) = 0; % set diagonal elements to 0(we do not need self similarity)
result=C(~any(n(:) == s)) ;
Но матрица может быть очень большой, поэтому лучше использовать al oop, чтобы избежать проблем с памятью:
idx=false(1,numel(C));
for k =1:numel(C)
idx(k) = ~any(n == full(s(k, :))) ;
end
result=C(idx) ;
Или используйте векторизованный подход :
[r, c, v] = find(s) ;
idx = sub2ind(size(s), r, c) ;
s(idx) = v.' == n(r) ;
result = C(~any(s)) ;