4

我对一般编程和 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 函数删除两行的解决方案,这不是我需要的。

谢谢

4

3 回答 3

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
    ...

默认情况下,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');
于 2013-05-28T14:02:23.173 回答
7

unique'rows'选项使用

[C ia ib] = unique( tmp2(:,1) );
C = tmp2( ia, : );
于 2013-05-28T13:59:58.013 回答
1

我看到了独特的解决方案,并想给出一个带有循环的解决方案。你可以看看哪个更快: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
于 2013-05-28T14:24:30.157 回答