Finding Indices of Duplicate Values

Suppose, I have a variable,
a{1}=[
2 2 1 3
5 2 1 1
5 2 1 4
5 2 1 2
1 1 2 1
2 2 2 1
1 1 3 4
1 1 3 3
4 1 3 5
1 1 4 3
1 1 4 4
1 1 4 1
2 2 4 1
2 2 4 2
4 1 4 2
4 1 4 6
2 2 5 2
2 2 5 6
4 1 5 1
4 1 5 2
4 1 5 6
4 1 5 5]
How can I find the indices of duplicate values for column 3:4?
I am using Matlab R2013a. Thank you in advance.

 Akzeptierte Antwort

Simon
Simon am 19 Nov. 2013

6 Stimmen

Hi!
You may use "unique". The second output is the index of all unique values, e.g. in column 3. All other indices are duplicates.

6 Kommentare

Did you mean,
[c,ia,ic]=unique(curriculum{1}(:,3:4),'rows')
ic being the index of all unique values?
RDG
RDG am 19 Nov. 2013
Got it!
I mean:
% indices to unique values in column 3
[~, ind] = unique(a(:, 3), 'rows');
% duplicate indices
duplicate_ind = setdiff(1:size(a, 1), ind);
% duplicate values
duplicate_value = a(duplicate_ind, 3);
Kevin Kevin
Kevin Kevin am 10 Jun. 2018
This is the solution I was looking for. Thank you.
Jeffrey Daniels
Jeffrey Daniels am 1 Okt. 2018
This is one solution but it is not complete or 100% accurate. The question asked for unique matches in columns 3 and 4. Also, this method only returns values that are repeated adjacent to each other. If you want to find all matches in all rows, I would refer you to this solution: https://www.mathworks.com/matlabcentral/answers/175086-finding-non-unique-values-in-an-array
Thank you Guys!
So helpful your tips.
Best.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

B Mohandes
B Mohandes am 10 Nov. 2016

5 Stimmen

by coincidence i found another way to do it, but thanks to those who answered already. the outputs of the command "unique" can be tricky to deal with, hence, here is a straight forward way.
>> find(hist(a,unique(a))>1)
the command (hist) counts the frequency (number of repetitions) of a certain value in a vector. if you use: hist(a), matlab will divide the whole range of values to 10 periods, and count the repetitions of values lying within these ranges. however, if you use: hist(a,b), then the repetitions are counted against the reference (b). so when you count the occurrences of each element in (a) against the unique elements of (a), and you find the results that are >2, then you're finding the elements that occurred more than once.
regards

4 Kommentare

Robert
Robert am 13 Sep. 2018
Bearbeitet: Robert am 13 Sep. 2018
Nice solution! hist doesn't work for cell arrays though.
But you can work like this:
[C,ia,ib]=unique(a,'rows','stable');
find(hist(ib,unique(ib))>1)
Yavor Kamer
Yavor Kamer am 10 Sep. 2019
i think you can use 1:max(ib) in your second unique
Matt Fetterman
Matt Fetterman am 2 Mär. 2020
I think a has to be sorted for this to work properly

Melden Sie sich an, um zu kommentieren.

RST
RST am 14 Mai 2024

0 Stimmen

If I understand correctly, you want the row indices where the pair a{1)}(3,4) are duplicated.
a{1}=[
2 2 1 3
5 2 1 1
5 2 1 4
5 2 1 2
1 1 2 1
2 2 2 1 % me!
1 1 3 4
1 1 3 3
4 1 3 5
1 1 4 3
1 1 4 4
1 1 4 1
2 2 4 1 % and me!
2 2 4 2
4 1 4 2 % and me!
4 1 4 6
2 2 5 2
2 2 5 6
4 1 5 1
4 1 5 2 % and me!
4 1 5 6 % and me!
4 1 5 5]
a = 1x1 cell array
{22x4 double}
[~,ixu] = unique( a{1}(:,3:4), 'rows'); % gives indices of the first of the unique rows
ixd = setdiff( 1:size(a{1},1), ixu); % (duplicate rows) = (all rows) - (unique rows)
clear ixu
ixd
ixd = 1x5
6 13 15 20 21
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
% show rows that are duplicates in columns 3:4
a{1}(ixd, :)
ans = 5x4
2 2 2 1 2 2 4 1 4 1 4 2 4 1 5 2 4 1 5 6
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

Gefragt:

RDG
am 19 Nov. 2013

Beantwortet:

RST
am 14 Mai 2024

Community Treasure Hunt

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

Start Hunting!

Translated by