2011-08-27 81 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庫。