在Matlab中查找矩阵中重复元素的位置

时间:2015-04-29 01:24:53

标签: matlab matrix

我有一个向量A = [ 1 1 1 2 3 3 3 2 2 1 1 1 1 3 3 3 ]

我想找到每个元素的位置并将其存储在自己的矩阵中。

更具体地说,我想找到每个元素集的每个元素的位置,用m矩阵表示(其中m是元素的类型,n是在向量A中找到的元素的数量) )。

因此,例如,假设向量A中只有值1,2和3,我的矩阵的第一列将是1的值,并将读取(1,2,3,10, 11,12,13)和第二列,对于值2,将读取(4,8,9)和第三列,对于值3,将读取(5,6,7,14,15, 16)。

3 个答案:

答案 0 :(得分:3)

这一班轮按预期工作:

B = accumarray(A', 1:length(A), [], @(x) {sort(x)})

B是一个单元格数组,B{i}包含i所在索引的排序列表。

答案 1 :(得分:3)

这可能是一种方法 -

%// For each element create a pair: [R,C], where the first element R would
%// represent its index position in input array and C would be their uniqueness 
[R,C] = find(bsxfun(@eq,A(:),unique(A(:).'))) %//'

%// Find lengths of each unique group
lens = diff([0 ; find(diff(C)) ; numel(C)])

%// Store each element into groups based on the uniqueness and whose
%// values would be the index positions i.e. taken from R
out = mat2cell(R(:).',1,lens)

针对给定输入的示例运行 -

>> A
A =
     1     1     1     2     3     3     3     2     2    ...
                            1     1     1     1     3     3     3
>> celldisp(out)
out{1} =
     1     2     3    10    11    12    13
out{2} =
     4     8     9
out{3} =
     5     6     7    14    15    16

答案 2 :(得分:1)

Divakar's answer类似,但sort

[out,i] = sort(A);
out1 = diff(find([1,diff(out)]));
out2 = [out1,numel(A)-sum(out1(:))];
out3 = mat2cell(i,1,out2);

<强>结果:

A = [ 1 1 1 2 3 3 3 2 2 1 1 1 1 3 3 3 ]; %// input

>> celldisp(out3)

out3{1} =

 1     2     3    10    11    12    13


out3{2} =

 4     8     9


out3{3} =

 5     6     7    14    15    16