我有一个矩阵,我希望用另一个值替换列(或行)的值。
我试过了:
m = Matrix.empty(5, 0)
n = Matrix.empty(0, 5)
g = m *n
puts g.column(3).map! { 3 }
但是map!
并非使用向量,而map
并未更改Matrix中列的值。那我怎么能这样做呢?
答案 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]]