我尝试在细胞阵列中找到独特的阵列。假设我有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))
,但它不起作用,我该怎么做?
我尝试在细胞阵列中找到独特的阵列。假设我有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))
,但它不起作用,我该怎么做?
这里的溶液:
u = unique(cellfun(@num2str,a,'Un',0));
为了转化他们回到向量:
u2 = cellfun(@str2num,u,'Un',0);
这里是保持数字的方式(不转换为字符串):
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
这就是我需要的,非常感谢! – Yevis
另一种解决方案不涉及转换为字符串:
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
大,非常感谢! – Yevis
顺便说一下,原来有两种类型的数据,如'14 17 18 19 24',[1x22 char],如何统一它们,以及如何将它们转换为数字类型? – Yevis
@Yevis,你是对的,你可以使用'str2num'函数发送它们。 –