问题如下:
我有一个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];
答案 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));
对每个单元格阵列进行唯一调用,如果每个单元格中都出现一个数字,那么您看到此数字的总次数应该等于您拥有的单元格总数。