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

nik*_*hil 1 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]
Run Code Online (Sandbox Code Playgroud)

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

[96, 342, 965, 150]
[803, 746, 422, 111] 
[699, 497, 121, 956] 
[732, 524, 37, 331]
Run Code Online (Sandbox Code Playgroud)

matrix.submatrix(2,2) 会回来的

[746, 422, 111] 
[497, 121, 956] 
[524, 37, 331]
Run Code Online (Sandbox Code Playgroud)

我浏览了rubydoc,但找不到能给我想要的任何方法.我如何在红宝石中做到这一点?

对于2D阵列,我想出了

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

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

Cas*_*per 9

看看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]]
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

m1 = m.minor(1..-1, 1..-1)
m2 = m1.minor(1..-1, 1..-1)
Run Code Online (Sandbox Code Playgroud)

要么:

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]]
Run Code Online (Sandbox Code Playgroud)