如何在Ruby 1.9中翻转矩阵对象?

3

我是一个 Ruby 的初学者。因此,我搜索了如何反转矩阵的方法。

1, 2, 3,  4    8, 9, 10, 11
4, 5, 6,  7 => 4, 5, 6,  7
8, 9, 10, 11   1, 2, 3,  4

我已经尝试过:

require 'matrix'
m = Matrix[ [1,2,3,4],[4,5,6,7], [8,9,10,11] ]
m_rev = Matrix.build(m.row_size, m.column_size){|row|
    m.row_size.downto(0){|i|
        row = m.row(i)
    }
}
3个回答

5
尝试使用以下代码: Matrix[*m.to_a.reverse]
m = Matrix[ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]
 #=> Matrix[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
r = Matrix[*m.to_a.reverse]
 #=> Matrix[[9, 10, 11, 12], [5, 6, 7, 8], [1, 2, 3, 4]]

不要错过*

感谢,它运作得非常简单 ^^。没有“”也可以。如果你有一些关于“”(像C语言中的指针)的文档,请分享一下。 - bioinfornatics
@bioinformatics 在 Ruby 中它被称为“splat”运算符:http://kconrails.com/2010/12/22/rubys-splat-operator/ - mportiz08
@生物信息学:在Ruby 1.8上,如果没有*,它是无法正常工作的,请尝试m = Matrix[[1, 2], [3, 4]]; r = Matrix[m.to_a.reverse]; m.row_size == r.row_sizem有2行,而r只有一行。也许他们在1.9中修复了这个问题,我无法检查。关于*,我曾经回答过一个关于Ruby中有趣语法的问题,你可能会发现它有用。 - Miki

2
您可以这样做:

您可以像下面这样操作:

m_rev = Matrix.rows m.to_a.reverse

1

你的想法是对的,只是 Matrix.build 会迭代行和列:

m_rev = Matrix.build(m.row_size, m.column_size){|row, column|
  m[-row-1, column]
}

更简单,更快速:

m_rev = Matrix.rows(m.to_a.reverse)
# or
m_rev = Matrix[*m.to_a.reverse]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接