Change or remove duplicate matrix elements
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
A
am 26 Aug. 2011
Bearbeitet: Stephen23
am 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 Kommentare
Sean de Wolski
am 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.
Akzeptierte Antwort
Sean de Wolski
am 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 Kommentare
Fangjun Jiang
am 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
Weitere Antworten (2)
Fangjun Jiang
am 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 Kommentare
Fangjun Jiang
am 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
am 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 Kommentare
Siehe auch
Kategorien
Mehr zu Data Type Conversion finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!