2011-08-27 78 views
1

我使用的是Ruby 1.9.2-p290和RubyMine。我尝试使用矩阵(需要'矩阵')。所以,我有几个问题。在RubyMine和Matrix中使用Ruby 1.9.2

  • 如何更改矩阵的任何值?

例如:

require 'matrix' 
matrix = Matrix[[1, -2, 3], [3, 4, -5], [2, 4, 1]] 
matrix[0, 0] = 5 
p matrix 

给出了未来:

in `<top (required)>': private method `[]=' called for Matrix[[1, -2, 3], [3, 4, -5], [2, 4, 1]]:Matrix (NoMethodError) 
from -e:1:in `load' 
from -e:1:in `<main>' 
  • 是否可以给我显示矩阵通过代码完成的RubyMine IDE的方法呢?
  • 我应该使用什么库作为矩阵?矩阵? Mathn?还有别的吗?

回答

2

广告1)我知道文档说[]=是一个公共实例方法,现实1.9.2似乎并不匹配:

matrix.private_methods.grep(/\[\]/) #=> [:[]=] 

我看到周围这两种方式。首先是使用send绕过private

第二个正在经历一个数组:

m = *matrix 
m[0][0] = 5 
matrix = Matrix[*m] 

如果你真的想,你可以改变该方法的可见性:

matrix.class.class_eval { public :[]= } 

请注意,我不鼓励其中的任何一种,类的实现方式暗示作者认为矩阵是不可变的对象。

广告2)不幸的是,我不知道RubyMine,但Matrix类的文档可以找到here

广告3)我还没有广泛使用Ruby中的矩阵,但为了我所需要的,Matrix类已经足够好了。

+0

该文档在哪里说'[] ='是公开的? –

+0

它在“公共实例方法”一节中列出。 –

+0

啊,的确如此。看起来像一个rdoc的bug。不知道我什么时候能够调查... –

0

只是想补充迈克尔的回答是:

1)黑客帝国图书馆的设计,使得矩阵是不可变的,你不能设置复数的实部以同样的方式。

我是图书馆的维护者(但不是原作者)。不过,我承认如果他们可变的话可能会有用。为了Ruby 1.9.3而改变它为时已晚,但我希望检查一下让它们变化的后果。

3)另一种可能性是检查NArray库。