ruby - 如何从 ruby​​ 中的矩阵中提取子矩阵

标签 ruby matrix

在 ruby​​ 中从矩阵中提取子矩阵的惯用方法是什么。

我有一个矩阵,这是 Matrix 的一个对象

[131, 673, 234, 103, 18]
[201, 96, 342, 965, 150]
[630, 803, 746, 422, 111] 
[537, 699, 497, 121, 956] 
[805, 732, 524, 37, 331]

我正在寻找一个带有类似签名的方法 matrix.submatrix(1,1) 这应该返回

[96, 342, 965, 150]
[803, 746, 422, 111] 
[699, 497, 121, 956] 
[732, 524, 37, 331]

matrix.submatrix(2,2) 会返回

[746, 422, 111] 
[497, 121, 956] 
[524, 37, 331]

我浏览了 rubydoc但找不到任何方法可以给我我想要的东西。我如何在 ruby​​ 中执行此操作?

我想出了一个二维数组

def submatrix(matrix)
  submatrix = matrix.collect{|row| row.slice(1..-1)}
  # Pop off the first row
  submatrix[1..-1]
end

我想知道我是否应该重新发明轮子,或者我是否可以使用 Matrix 类中的一些东西。

最佳答案

看看Matrix#minor :

a = [[131, 673, 234, 103, 18], 
     [201, 96, 342, 965, 150], 
     [630, 803, 746, 422, 111], 
     [537, 699, 497, 121, 956], 
     [805, 732, 524, 37, 331]]

m = Matrix[*a]

m1 = m.minor(1..4, 1..4)
=> Matrix[[96, 342, 965, 150],  [803, 746, 422, 111], 
          [699, 497, 121, 956], [732, 524, 37, 331]]

m2 = m1.minor(1..3, 1..3)
=> Matrix[[746, 422, 111], [497, 121, 956], [524, 37, 331]]

您还可以:

m1 = m.minor(1..-1, 1..-1)
m2 = m1.minor(1..-1, 1..-1)

或者:

class Matrix
  def submatrix(x, y)
    self.minor(x..-1, y..-1)
  end
end

m.submatrix(2, 2)
=> Matrix[[746, 422, 111], [497, 121, 956], [524, 37, 331]]

关于ruby - 如何从 ruby​​ 中的矩阵中提取子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185773/

相关文章:

ruby - 寻找在 Ruby 中轻松实现类文件/IO 类的方法

ruby-on-rails - 待处理的迁移错误 |无法删除重复迁移

ruby - 使用 twitter gem,如何从 Twitter::REST:Tweets.retweet 转推 Twitter::Tweet?

matlab - 交换仅对下对角线元素生效的行

Matlab:使用索引增加矩阵值

arrays - 选择第一列值在列表中至少出现一次的行

ruby - 通过迭代嵌套哈希来构建新哈希

ruby-on-rails - Rails 使用权重查询随机记录

matlab - 转置矩阵的每一行并将结果向量乘以其他矩阵的更快方法?

c++ - lu_factorize 返回什么?