matlab:删除重复值

matlab:删除重复值,matlab,duplicates,vectorization,duplicate-removal,Matlab,Duplicates,Vectorization,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

我对一般编程和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
        ...      ...];
如何删除左栏为1.0但右栏值不同的零件?我想用19.1保存该行。我搜索了一些解决方案,但找到了一些使用histc函数删除两行的解决方案,这不是我需要的


谢谢

使用
唯一
而不使用
选项

[C ia ib] = unique( tmp2(:,1) );
C = tmp2( ia, : );

您可以使用
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
    ...
默认情况下,
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
    ...
它仍然保留最后找到的条目。如果要保留找到的第一个条目,请使用

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

我看到了具有唯一性的解决方案,并希望给出一个具有循环的解决方案。你可以看看哪一个更快:D!这个循环可能会得到改善

clear
tmp = [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];

ltmp = length(tmp);
jj = 1;
for ii = 1 : ltmp
    if ii > 1
        if tmp(ii, 1) == tmp(ii - 1, 1)
            continue
        end
    end
    if ii < ltmp
        if tmp(ii, 1) == tmp(ii + 1, 1)
            tmp2(jj,1) = tmp(ii, 1);
            tmp2(jj,2) = min(tmp(ii, 2),tmp(ii + 1, 2));
        else
            tmp2(jj, 1) = tmp(ii, 1);
            tmp2(jj, 2) = tmp(ii, 2);
        end
    else
            tmp2(jj, 1) = tmp(ii, 1);
            tmp2(jj, 2) = tmp(ii, 2);
    end
    jj = jj + 1;
end
清除
tmp=[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];
ltmp=长度(tmp);
jj=1;
对于ii=1:ltmp
如果ii>1
如果tmp(ii,1)=tmp(ii-1,1)
持续
结束
结束
如果ii
如果你认为你的循环比
独特的好:用一个小的基准来展示它。否则,只要看看代码,告诉我它比
unique
解决方案更好。。。此外,我认为这可能“更好”的唯一方法是它总是给出最小值,而不是像
unique
那样给出第一个或最后一个值。它也不会对结果进行排序,但也可以通过unique轻松实现。我建议使用
unique
SetOrder
=
'stable'
来保持顺序。@DennisJaheruddin:是的,尽管该选项仅在新的Matlab版本中可用(不知道到底是哪个版本开始包含它,但至少在R2010a中没有)