2015-04-17 11 views
-2

Это вопрос до Issue in deleting supersets in Matlab. в предыдущем вопросе я был удаление суперсетов и сохранением множества вспомогательного, для которого у меня есть рабочий ответ сейчас я хочу, чтобы заменить суперсеты там с подмножествами, а не удалять их, например, я набор данных следующим образом:Как заменить надмножества такими подмножествами в 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)); 
% 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) 

, когда я запускаю выше код выход следующим образом:

a{1} = [5] 
a{2} = [1] 
a{3} = [11] 
a{4} = [16] 
a{5} = [14] 

я хочу сделать, это заменить супер наборы с подмножествами, а не удалять их:

ожидается выход должен быть следующим:

a{1} = [5] 
a{2} = [11] 
a{3} = [1] 
a{4} = [5] 
a{5} = [5] 
a{6} = [11] 
a{7} = [11] 
a{8} = [16] 
a{9} = [14] 
a{10} = [14] 
+1

Пожалуйста, объясните, ожидаемый результат. Почему 'a {4}' 5, а не 16? Имеет ли это значение или должно быть выбрано какое-либо существующее подмножество? – Daniel

+0

, потому что в цикле единственное значение '5' приходит первым, когда мы идем сверху вниз, мы начинаем с пар и опускаемся до одиночных выборов, если в' a {4} 'было' 16', чем было бы '16 'at location' a {4} ' –

+0

Непонятно, что вы спрашиваете. Что такое правило для получения этого вывода? –

ответ

0

Попробуйте это:

m = arrayfun(@(i,j) all(ismember(a{i}, a{j})), ii, jj); %// subset relationship 
[valid, ind] = max(tril(m, -1)); %// consider only other sets with higher index 
ind1 = find(valid); %// these will be replaced... 
ind2 = ind(valid); %// ...by these ones 
a(ind1) = a(ind2);