独特的细胞载体

时间:2014-02-20 19:13:28

标签: matlab cell

我尝试在单元格数组中找到唯一的数组。假设我有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)),但它不起作用,我该怎么做?

3 个答案:

答案 0 :(得分:2)

这是一种保持数字的方法(不转换为字符串):

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 :(得分:1)

这是一个解决方案:

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

将它们转换回矢量:

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

答案 2 :(得分: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