2015-04-16 2 views
0

я имею набор данных, состоящие из наборов я хочу, чтобы удалить супер наборы, для которых подмножества присутствуют следующие:Проблемы при удалении суперсетов в 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] 

кто может помочь, как исправить этот код, чтобы я мог получить точный набор результатов. спасибо

+0

Не могли бы вы записать ожидаемый результат? – Divakar

+0

@Divakar Я обновил свой вопрос с ожидаемым выходом –

ответ

2

Я думаю, вам нужно использовать нижнюю треугольную часть вместо верхнего:

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) 

Кстати, может быть проще просто запустить двойной цикл вместо указанных выше операций с матрицей.

+0

спасибо за ваш ответ, он сработал, можно объяснить в строке, почему верхняя треугольная часть не давала желаемых результатов –

+0

еще один вопрос, который я хотел спросить, что если вместо удаления супер-наборы, я просто хочу заменить их поднаборами в приведенном выше коде, и мы должны сохранить дубликаты, т. е. 'a {1} = [1 2 3]' и 'a {2} = [2 3]', поэтому выход должно быть 'a {1} = [2 3]' и 'a {2} = [2 3]' –