matlab:删除重复的值

dsp*_*dsp 4 matlab vectorization duplicates duplicate-removal

我对编程和MATLAB相当新,我在从矩阵中删除值时遇到了一些问题.

我有矩阵tmp2的值:

tmp2 = [...      ...
        0.6000   20.4000
        0.7000   20.4000
        0.8000   20.4000
        0.9000   20.4000
        1.0000   20.4000
        1.0000   19.1000
        1.1000   19.1000
        1.2000   19.1000
        1.3000   19.1000
        1.4000   19.1000
        ...      ...];
Run Code Online (Sandbox Code Playgroud)

如何删除左栏中有1.0的部分,但右边的值是不同的?我想用19.1保存行.我搜索了解决方案,但发现一些使用histc函数删除两行,这不是我需要的.

谢谢

Rod*_*uis 8

你可以这样做unique:

>> [~,b] = unique(tmp2(:,1)); % indices to unique values in first column of tmp2
>> tmp2(b,:)                  % values at these rows
ans =
    0.6000   20.4000
    0.7000   20.4000
    0.8000   20.4000
    0.9000   20.4000
    1.0000   19.1000
    ...
Run Code Online (Sandbox Code Playgroud)

默认情况下,unique保存找到的最后一个唯一值,并对输出进行排序.这恰好是你想要/拥有的,所以你很幸运:)

如果这不是你想要/拥有的,你将不得不再修补一下.删除保留订单的重复项如下:

% mess up the order
A = randperm(size(tmp2,1));
tmp2 = tmp2(A,:)

% use third output of unique
[a,b,c] = unique(tmp2(:,1));

% unique values, order preserved
tmp2(b(c),:)

ans =
    1.1000   19.1000
    1.2000   19.1000
    1.0000   20.4000
    0.7000   20.4000
    1.0000   20.4000
    1.4000   19.1000
    0.6000   20.4000
    0.9000   20.4000
    1.3000   19.1000
    0.8000   20.4000
    ...
Run Code Online (Sandbox Code Playgroud)

仍保留最后一个条目.如果要保留第一个条目,请使用

% unique values, order preserved, keep first occurrence
[a,b,c] = unique(tmp2(:,1), 'first');
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`unique`与`SetOrder` =`'stable'`来保存订单. (4认同)

Sha*_*hai 6

使用unique没有'rows'选项

[C ia ib] = unique( tmp2(:,1) );
C = tmp2( ia, : );
Run Code Online (Sandbox Code Playgroud)