フィルターのクリア

Change or remove duplicate matrix elements

4 ビュー (過去 30 日間)
A
A 2011 年 8 月 26 日
編集済み: Stephen23 2016 年 2 月 2 日
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 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 8 月 26 日
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.
A
A 2011 年 8 月 26 日
That's true. What if on the other hand I want to completely remove any duplicate entries?

サインインしてコメントする。

採用された回答

Sean de Wolski
Sean de Wolski 2011 年 8 月 26 日
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 件のコメント
Fangjun Jiang
Fangjun Jiang 2011 年 8 月 26 日
@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
Sean de Wolski
Sean de Wolski 2011 年 8 月 26 日
Thst's true, hence the while-loop I mentioned in the comment above.

サインインしてコメントする。

その他の回答 (2 件)

Fangjun Jiang
Fangjun Jiang 2011 年 8 月 26 日
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 件のコメント
A
A 2011 年 8 月 26 日
Ah sorry thats a bit hard to read, I didn't realize the numbers woudl be so close together. It is [value NewValue] as you put in your code.
Fangjun Jiang
Fangjun Jiang 2011 年 8 月 26 日
The reason is simple. You added 0.1 to the 2nd duplicated value which will change the comparison of your next loop.

サインインしてコメントする。


MaVo
MaVo 2016 年 2 月 2 日
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

カテゴリ

Help Center および File ExchangeLine Plots についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by