Как заменить надмножества там подмножествами в 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 ответ

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

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);
Другие вопросы по тегам