以更清洁/更高效的方式过滤数据

时间:2013-06-10 13:41:12

标签: performance matlab filtering octave

我有一组带有一堆列的数据。类似下面的内容(实际上我的数据有大约五十万行):

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
];

现在,假设我要删除第一列为36的行。

我这样做是这样的:

filterRows = [3 6];

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

哪个有效,但循环让我觉得我错过了一个更有效的技巧。有一个更好的方法吗?

最初我试过了:

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

但当然这不起作用。

1 个答案:

答案 0 :(得分:4)

使用logical indexing

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

在一般情况下,第一列的值存储在filterRows中,您可以使用ismember生成逻辑向量rows

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

bsxfun

rows = any(bsxfun(@eq, big(:, 1), filterRows(:).'), 2);