从矩阵中过滤一些行

时间:2013-11-14 17:32:37

标签: matrix filter octave

假设我有这个矩阵:

matrix = [2 2; 2 3; 3 4; 4 5]

现在我想过滤掉所有不以偶数开头的行来生成

[2 2; 2 3; 4 5]

是否有执行此操作的高级过程,或者我是否需要为其编写代码?

1 个答案:

答案 0 :(得分:2)

您可以为第一个元素为偶数的行获取逻辑索引,并使用:选择所有列。这是它如何完成,逐行:

octave> matrix = [2 2; 2 3; 3 4; 4 5]
matrix =

   2   2
   2   3
   3   4
   4   5

octave> ! mod (matrix(:,1), 2)
ans =

   1
   1
   0
   1

octave> matrix(! mod (matrix(:,1), 2),:)
ans =

   2   2
   2   3
   4   5

编辑:在下面的评论中,它被要求提供其他选择方法。我没有意识到它的任何特定功能,但上面的内容是使用函数索引:

even_rows = matrix(! mod (matrix(:,1), 2), :) # first element is even
s3_rows   = matrix(matrix(:,1) == 3, :); # first element is 3
int_rows  = matrix(fix (matrix(:,1)), == matrix(:,1), :); # first element is an integer

如果有一个函数,人们仍然需要编写函数,它不会更简单或更容易阅读。但是如果你想写一个函数,你可以:

function selec = select_rows (func, mt)
  selec = mt(func (mt(:,1)),:);
endfunction
even_rows = select_rows (@(x) ! mod (x, 2), matrix);
se_rows   = select_rows (@(x) x == 3, matrix);
int_rows  = select_rows (@(x) fix (x) == x, matrix);

EDIT2:让已经匹配的行,只需在掩码上跟踪它们。例如:

mask = ! mod (matrix(:,1), 2); # mask for even numbers
even = matrix(mask,:);
mask = ! mask & matrix(:,1) == 3; # mask for left overs starting with a 3
s3   = matrix(mask,:);
rest = matrix(! mask, :); # get the leftovers

如上所述,您可以编写一个执行该功能的函数。它需要一个矩阵作为第一个参数加上任意数量的函数句柄。它将迭代函数句柄,每次修改掩码并用矩阵填充单元格数组。