# How do I get all non-unique occurrences?

34 views (last 30 days)
Dominik Mattioli on 8 Feb 2017
Commented: Stephen23 on 8 Feb 2017
MATLAB's unique function only returns the non-unique indices to either the 'first' or 'last' occurrences of unique elements/rows of a vector/matrix. Is there any way to get 'all' occurrences short of creating my own recursive unique function? I plan on using this for very large matrices (i.e. unique(__,'rows')). Below is a minor example of the problem in the context of a vector:
A = [9 9 9 3 3 3 3];
[U1,AiF] = unique(A,'first');
[U2,AiL] = unique(A,'last')
% Returns
U1 = [3 9] % U1 is the same as U2
AiF = [4 1]
AiL = [7 3]
% I want something like this:
Ai_all = {[4 5 6 7],[1 2 3]}

Stephen23 on 8 Feb 2017
Edited: Stephen23 on 8 Feb 2017
You could use accumarray to collect the corresponding indices:
>> A = [9,9,9,3,3,3,3];
>> [~,~,idx] = unique(A);
>> idy = 1:numel(A);
>> Z = accumarray(idx(:),idy(:),[],@(n){n});
>> Z{:}
ans =
4
5
6
7
ans =
1
2
3
##### 2 CommentsShowHide 1 older comment
Stephen23 on 8 Feb 2017
>> A = [1,3;2 4;2 4;5 7;1 3];
>> [~,~,idx] = unique(A,'rows');
>> idy = 1:size(A,1);
>> Z = accumarray(idx(:),idy(:),[],@(n){n});
>> Z{:}
ans =
5
1
ans =
3
2
ans =
4

### Categories

Find more on Matrix Indexing in Help Center and File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!