假设我有这个矩阵:
matrix = [2 2; 2 3; 3 4; 4 5]
现在我想过滤掉所有不以偶数开头的行来生成
[2 2; 2 3; 4 5]
是否有执行此操作的高级过程,或者我是否需要为其编写代码?
答案 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
如上所述,您可以编写一个执行该功能的函数。它需要一个矩阵作为第一个参数加上任意数量的函数句柄。它将迭代函数句柄,每次修改掩码并用矩阵填充单元格数组。