替换Ruby中的Vector值

时间:2015-05-11 13:50:02

标签: ruby matrix

我有一个矩阵,我希望用另一个值替换列(或行)的值。

我试过了:

m = Matrix.empty(5, 0)
n = Matrix.empty(0, 5)
g = m *n

puts g.column(3).map! { 3 }

但是map!并非使用向量,而map并未更改Matrix中列的值。那我怎么能这样做呢?

2 个答案:

答案 0 :(得分:2)

Matrix和Vector的Ruby标准类不提供map!方法。

您可以自行编写方法,例如重新打开课程。

更好的选择(IMHO)是使用更强大的矩阵类。

看看SciRuby:http://sciruby.com/nmatrix/docs/NMatrix.html

SciRuby包中有NMatrix类,它提供了这种方法和许多其他方法:

[]=(*args)
Modify the contents of an NMatrix in the given cell

答案 1 :(得分:1)

g.column(3).class
=> Vector
Vector.instance_methods.grep(/map/)
=> [:map, :map2, :flat_map]

Vector没有map!方法。

 g[0, 0] =3
 NoMethodError: private method `[]=' called for #<Matrix:0x007f8cd8951d18>  

[]=是一种私有方法,您可以使用send方法绕过私有方式:

 g.send(:[]=, 0, 0, 3)
 => 3


g = Matrix[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

5.times do |i|
    g.send(:[]=,i, 3, 3)
end

g
=> Matrix[[0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0], [0, 0, 0, 3, 0]]

irb(main):580:0> 5.times do |i|
irb(main):581:1* g.send(:[]=, 0, i, 3)
irb(main):582:1> end
=> 5
irb(main):583:0> g
=> Matrix[[3, 3, 3, 3, 3], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]