1

我正在使用 ruby​​ 1.9.2-p290 和 RubyMine。我尝试使用矩阵(需要'矩阵')。所以,我有几个问题。

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

例如:

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 中的代码完成向我展示矩阵方法?
  • 我应该为矩阵使用什么库?矩阵?数学?还有什么?
4

2 回答 2

2

广告 1)我知道文档说这[]=是一个公共实例方法,1.9.2 中的现实似乎与此不符:

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

我看到了两种解决方法。第一个是send用来绕过private

matrix.send(:[]=, 0, 0, 5) #=> 5

第二个是通过一个数组:

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

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

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

请注意,我不鼓励任何这些,类的实现方式强烈暗示作者认为矩阵是不可变对象。

广告 2) 不幸的是,我不知道 RubyMine,但Matrix可以在此处找到该类的文档。

广告 3)我还没有在 Ruby 中广泛使用矩阵,但是对于我需要的矩阵来说,这个Matrix类已经足够好了。

于 2011-08-28T12:12:32.010 回答
0

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

1)矩阵库的设计使得矩阵是不可变的,就像你不能设置复数的实部一样。

我是图书馆的维护者(但不是原作者)。不过,我承认如果它们是可变的,它可能会很有用。为 Ruby 1.9.3 更改它为时已晚,但我希望检查使它们可变的后果。

3)另一种可能性是检查NArray图书馆。

于 2011-09-10T18:16:17.503 回答