2014-02-20 77 views
1

我嘗試在細胞陣列中找到獨特的陣列。假設我有6個細胞用下面的載體:獨特的細胞載體

a{1}=[1 2]; 
a{2}=[1 2 3]; 
a{3}=[2 3 4]; 
a{4}=[1 2]; 
a{5}=[1 2 3]; 
a{6}=[2 3 4]; 

然後,結果應該是[1 2][1 2 3][2 3 4]。我用u=(cellfun(@unique,a,'Un',0)),但它不起作用,我該怎麼做?

回答

1

這裏的溶液:

u = unique(cellfun(@num2str,a,'Un',0)); 

爲了轉化他們回到向量:

u2 = cellfun(@str2num,u,'Un',0); 
+0

大,非常感謝! – Yevis

+0

順便說一下,原來有兩種類型的數據,如'14 17 18 19 24',[1x22 char],如何統一它們,以及如何將它們轉換爲數字類型? – Yevis

+0

@Yevis,你是對的,你可以使用'str2num'函數發送它們。 –

1

這裏是保持數字的方式(不轉換爲字符串):

ne = cellfun(@numel,a); 
C = accumarray(ne(:),1:numel(a),[],@(x) {unique(vertcat(a{x}),'rows')}); 
C = C(~cellfun(@isempty,C)); 

C{1} 
ans = 
    1  2 

C{2} 
ans = 
    1  2  3 
    2  3  4 

a中的每個單元都需要包含一個行向量。

如果需要重新組織輸出:

m2c = @(x) mat2cell(x,ones(size(x,1),1),size(x,2)); 
C2 = cellfun(m2c,C,'uni',0); 
C2 = vertcat(C2{:}) 

C2{1} 
ans = 
    1  2 

C2{2} 
ans = 
    1  2  3 

C2{3} 
ans = 
    2  3  4 
+1

這就是我需要的,非常感謝! – Yevis

0

另一種解決方案不涉及轉換爲字符串:

n = numel(a); 
[i1 i2] = ndgrid(1:n); %// generate all pairs of elements (their indices, really) 
equals = arrayfun(@(k) isequal(a{i1(k)},a{i2(k)}), 1:n^2); %// are they equal? 
equals = tril(reshape(equals,n,n),-1); %// make non-symmetrical and non-reflexive 
u = a(~any(equals)); %// if two elements are equal, remove one of them