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 に答える
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 に答える