Change or remove duplicate matrix elements
    7 views (last 30 days)
  
       Show older comments
    
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 Comments
  Sean de Wolski
      
      
 on 26 Aug 2011
				So what if by adding 0.1 you duplicate a value? You'll have to do a while loop checking to ensure this didn't happen and rerunning the engine again if it did.
Accepted Answer
  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;
8 Comments
  Fangjun Jiang
      
      
 on 26 Aug 2011
				@Sean, this won't work. The problem is not the floating point comparison. It's the multiple duplication. If the first round has 3 duplications, then after the round, you still have 2 duplications.
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
More Answers (2)
  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]
3 Comments
  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
0 Comments
See Also
Categories
				Find more on Introduction to Installation and Licensing 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!



