0

假设我有这个矩阵:

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

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

[2 2; 2 3; 4 5]

是否有执行此操作的高级程序,还是我必须为此编写代码?

4

1 回答 1

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

如上所述,您可以编写一个函数来完成它。它将一个矩阵作为第一个参数加上任意数量的函数句柄。它将遍历函数句柄,每次修改掩码并用矩阵填充单元格数组。

于 2013-11-14T17:58:48.290 回答