# Change or remove duplicate matrix elements

18 views (last 30 days)
A on 26 Aug 2011
Edited: Stephen23 on 2 Feb 2016
I have the matrix:
value =
3.1727
5.2495
5.2708
3.3852
5.6222
5.2708
5.1444
4.9834
5.7499
5.7499
3.4728
3.4728
5.3560
5.7499
3.4728
5.7286
6.1225
3.6539
3.0351
4.3020
5.2296
3.8040
4.6747
5.4412
3.6539
and I want to add 0.1 to any duplicate entries, so that all values are unique, and none are removed.
I have tried:
value=sort(value)
for i=1:(length(value)-1)
if value(i+1)==value(i);
value(i+1)=(value(i+1)+0.1);
end
end
But for some reason it has no impact on the matrix..
Your help is greatly appreciated, thanks!
**EDIT: how can i remove all but the first occurance of a duplicate value? unique does not work for me.
##### 2 CommentsShowHide 1 older comment
A on 26 Aug 2011
That's true. What if on the other hand I want to completely remove any duplicate entries?

Sean de Wolski on 26 Aug 2011
X = [1 2 3 3 4 5 2]';
X2 = sort(X,1);
idx = [false;diff(X2)<(10^-6)]; %equal to 10^-6th precision
X2(idx) = X2(idx)+.1;
Sean de Wolski on 26 Aug 2011
Thst's true, hence the while-loop I mentioned in the comment above.

Fangjun Jiang on 26 Aug 2011
It works in certain degree but your algorith has a flaw. You'll see it clearly running the following.
value=sort(value);
NewValue=value;
for i=1:(length(NewValue)-1)
if NewValue(i+1)==NewValue(i);
NewValue(i+1)=(NewValue(i+1)+0.1);
end
end
[value NewValue]
Fangjun Jiang on 26 Aug 2011
The reason is simple. You added 0.1 to the 2nd duplicated value which will change the comparison of your next loop.

MaVo on 2 Feb 2016
I had a similar issue with a time sequence in 0.005 s steps, but I figured out a solution that worked for me. My problem during debugging was, that it didn't go into the if-condition. I solved this by comparing integers than double values. Maybe this helps someone.
s_length = length(s_time);
ctr = 1;
for ctr = 2:s_length
% Checking values for debugging
new = uint64(s_time(ctr,1)/0.005);
old = uint64(s_time((ctr-1),1)/0.005);
before = (ctr-1);
if new == old
s_time(ctr:end,1) = s_time(ctr:end,1)+0.005;
end
if new > (old + 1)
s_time(ctr:end) = s_time(ctr:end) - 0.005;
end
end

### Categories

Find more on Loops and Conditional Statements 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!

Translated by