2

一連の列を持つ一連のデータがあります。次のようなもの (実際には、私のデータには約 50 万行あります):

big = [
    1 1 0.93 0.58;
    1 2 0.40 0.34;
    1 3 0.26 0.31;
    1 4 0.40 0.26;
    2 1 0.60 0.04;
    2 2 0.84 0.55;
    2 3 0.53 0.72;
    2 4 0.00 0.39;
    3 1 0.27 0.51;
    3 2 0.46 0.18;
    3 3 0.61 0.01;
    3 4 0.07 0.04;
    4 1 0.26 0.43;
    4 2 0.77 0.91;
    4 3 0.49 0.80;
    4 4 0.40 0.55;
    5 1 0.77 0.40;
    5 2 0.91 0.28;
    5 3 0.80 0.65;
    5 4 0.05 0.06;
    6 1 0.41 0.37;
    6 2 0.11 0.87;
    6 3 0.78 0.61;
    6 4 0.87 0.51
];

3さて、最初の列が aまたは aである行を取り除きたいとしましょう6

私はそれを次のようにやっています:

filterRows = [3 6];

for i = filterRows 
    big = big(~ismember(1:size(big,1), find(big(:,1) == i)), :);
end

これは機能しますが、ループにより、より効率的なトリックが不足していると思われます。これを行うより良い方法はありますか?

もともと私が試した:

big(find(big(:,1) == filterRows ),:) = [];

しかし、もちろんそれはうまくいきません。

4

1 に答える 1

4

論理インデックスを使用する:

rows = (big(:, 1) == 3 | big(:, 1) == 6);
big(rows, :) = [];

最初の列の値が に格納される一般的なケースでは、次のように論理ベクトルをfilterRows生成できます。rowsismember

rows = ismember(big(:, 1), filterRows);

またはでbsxfun

rows = any(bsxfun(@eq, big(:, 1), filterRows(:).'), 2);
于 2013-06-10T13:43:00.337 に答える