假设我有这个矩阵:
matrix = [2 2; 2 3; 3 4; 4 5]
现在我想过滤掉所有不以偶数开头的行来产生
[2 2; 2 3; 4 5]
是否有执行此操作的高级程序,还是我必须为此编写代码?
您可以获得第一个元素为偶数的行的逻辑索引,并用于:
选择所有列。下面是它是如何完成的,一行一行:
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
如上所述,您可以编写一个函数来完成它。它将一个矩阵作为第一个参数加上任意数量的函数句柄。它将遍历函数句柄,每次修改掩码并用矩阵填充单元格数组。