【问题标题】:Filter some rows from a matrix从矩阵中过滤一些行
【发布时间】:2013-11-15 16:58:01
【问题描述】:

假设我有这个矩阵:

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

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

[2 2; 2 3; 4 5]

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

【问题讨论】:

    标签: matrix filter octave


    【解决方案1】:

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

    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
    

    编辑: 在下面的 cmets 中,它被要求提供其他选择方法。我不知道它有什么特定的功能,但上面的东西是用一个功能索引的:

    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
    

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

    【讨论】:

    • 谢谢,我现在明白了,您是否知道是否有一种简单的方法可以将行划分为多个矩阵?我希望它具有相同的功能。
    • @wvxvw 你能更具体一点吗?你为什么要他们分开?如何?你的意思是你想要每一行的组?我不确定你在问什么。
    • 哦,我想要这样,比如说,在我的例子中,会有一个函数给出一个谓词,将行分类为几个类别,返回矩阵,每个矩阵都包含属于该类别的行。说,我希望具有第一个元素 2 的行属于第一类,属于第二类的行将 3 作为它们的第一个元素,其余的将属于第三类。这样该函数将返回 3 个矩阵:[2 2; 2 3], [3 4], [4 5]
    • @wvxvw 如果一行匹配多个类别怎么办?我会说使用我上面的示例和不同的索引。您可以编写一个接受函数句柄的简单函数来执行此操作,但这不会节省更多的输入。
    • 第一个谓词获胜。这是一个原型函数(在 Haskell 中它是标准库 API 的一部分:haskell.org/hoogle/?hoogle=partition),但是好的,我知道这可能并不常见。
    猜你喜欢
    • 2013-10-02
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多