Проблема с удалением надмножеств в Matlab
У меня есть набор данных, состоящий из наборов, я хочу удалить супер наборы, для которых присутствуют подмножества следующим образом:
a{1} = [5]
a{2} = [4 11 14]
a{3} = [1]
a{4} = [5 16]
a{5} = [5]
a{6} = [11 16]
a{7} = [11]
a{8} = [16]
a{9} = [9 14 17]
a{10} = [14]
[ii, jj] = ndgrid(1:numel(a));
s = cellfun(@(x,y) all(ismember(x,y)), a(ii), a(jj));
s = triu(s,1); %// count each pair just once, and remove self-pairs
similarity = a(~any(s,1));
celldisp(similarity)
Результат выглядит следующим образом:
a{1} = [5]
a{2} = [4 11 14]
a{3} = [1]
a{4} = [11 16]
a{5} = [11]
a{6} = [16]
a{7} = [9 14 17]
a{8} = [14]
как показывает вывод, все еще есть надмножества, которые следует удалить, т.е. a{2}
так как a{5}
содержит 11
который является его подмножеством,a{4}
должны быть удалены, потому что a{5}
содержит 11
а также a{6}
содержать 16
так же как a{7}
должны быть удалены тоже, потому что a{8}
содержит подмножество 14
,
ожидаемый результат
a{1} = [5]
a{2} = [1]
a{3} = [11]
a{4} = [16]
a{5} = [14]
Может ли кто-нибудь помочь, как исправить этот код, чтобы я мог получить точный набор результатов. Спасибо
1 ответ
Я думаю, что вам нужно использовать нижнюю треугольную часть вместо верхней:
s = tril(s,-1); % instead of s = triu(s,1);
редактировать
Сохранение нижней треугольной части работает только тогда, когда надмножества всегда появляются перед подмножествами. Вот общая версия, которая всегда должна работать нормально.
[ii, jj] = ndgrid(1:numel(a));
s = cellfun(@(x,y) all(ismember(x,y)), a(ii), a(jj));
% Set diagonal to zero.
s = s - diag(diag(s));
% Indicator matrix for sets that are exactly equal.
same = s & s';
% For equal sets keep only the first occurence.
keep = triu(same) | ~same.*s;
% Delete supersets.
similarity = a(~any(keep,1));
celldisp(similarity)
Кстати, может быть проще просто запустить двойной цикл вместо вышеуказанных матричных операций.