在不同大小的不同单元阵列中查找重复值的最快方法

时间:2014-09-15 15:13:38

标签: matlab cell-array

问题如下:

我有一个indx{jj}形式的单元格数组,其中每个jj都是1xNjj的数组,这意味着它们都有不同的大小。在我的案例中max(jj)==3,但让我们考虑一下摇动它的一般情况。

你怎么能以最快的方式找到所有jj中重复的值?

我可以猜测如何使用几个for循环,但是有一个“一个(三个?)衬垫”?

简单示例:

indx{1}=[ 1 3 5 7 9];
indx{2}=[ 2 3 4 1];
indx{3}=[ 1 2 5 3 3 5 4];


ans=[1 3];

3 个答案:

答案 0 :(得分:4)

一种可能性是使用for循环intersect

result = indx{1}; %// will be changed
for n = 2:numel(indx)
    result = intersect(result, indx{n});
end

答案 1 :(得分:3)

几乎没有循环的方法(几乎因为cellfun基本上在其中使用循环,但它在这里的效果很小,因为我们使用它来查找每个单元格中的元素数量) -

lens = cellfun(@numel,indx);

val_ind = bsxfun(@ge,lens,[1:max(lens)]');
vals = horzcat(indx{:});

mat1(max(lens),numel(lens))=0;
mat1(val_ind) = vals;

unqvals = unique(vals);
out = unqvals(all(any(bsxfun(@eq,mat1,permute(unqvals,[1 3 2]))),2));

答案 2 :(得分:3)

我可以建议的另一种可能性,虽然Luis Mendo的答案非常好,但是要取出单元格数组中的所有向量并删除重复项。这可以通过cellfun完成,并指定unique作为要操作的函数。当我们在每个索引处输出一个单元格数组时,您必须将UniformOutput标志设置为false。您还必须小心,假设每个单元格数组都是行向量或所有列向量。你不能混合阵列的形状,或者这种方法不起作用。

完成此操作后,通过cell2mat将所有向量连接成一个数组,然后通过histc进行直方图。您可以将边指定为之前创建的单个数组中的所有唯一数字。请注意,在继续之前,您必须在输出单个阵列上另外调用unique。一旦计算了直方图,对于bin计数等于单元格数组中元素总数(在您的情况下为3)的任何条目,那么这些是您在所有单元格中看到的值。就这样:

A = cell2mat(cellfun(@unique, indx, 'uni', 0));
edge_values = unique(A);
h = histc(A, edge_values);
result = edge_values(h == numel(indx));

对每个单元格阵列进行唯一调用,如果每个单元格中都出现一个数字,那么您看到此数字的总次数应该等于您拥有的单元格总数。