2015-04-17 42 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

請解釋預期的輸出。爲什麼是'4而不是16'?這是否重要或應該挑選現有子集? – Daniel

+0

,因爲在一個循環中,當我們從上到下,單個值「5」出現時,我們從成對開始,並且如果在「a {4}」中有'16'而不是'16' '在位置'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);