2

我有一组包含一堆列的数据。类似于以下内容(实际上我的数据有大约一百万行):

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

现在,假设我想删除第一列是 a3或 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 回答