2014-10-22 34 views
0

我现在使用的是Ruby,并且来自MATLAB背景。我想要创建一个对象矩阵,以便能够执行矩阵/数学形式的索引元素,如MATLAB(mat(ii,jj)= 某些单元对象)。在Ruby中我没有看到类似的矩阵类型对象。如何在Ruby中创建诸如数组/列表等对象的“矩阵”?

  • 我看到的是最好的选择是创建一个多维数组来给出矩阵的结构,这是正确的吗?
  • 如何在Ruby中最好地创建矩阵状结构?
  • 行和列的大小是否会从初始化点定义,并且可以在之后进行更改?

目前,我特别希望在该矩阵状结构的元件中插入其它阵列对象,并做到:(ar=Array.new(3){Array.new(3)}

irb(main):001:0> ar=Array.new(3){Array.new(3)} 
=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 
irb(main):002:0> ar.size 
=> 3 
irb(main):004:0> ar[0].size 
=> 3 
irb(main):005:0> ar[0][0].size 
NoMethodError: undefined method `size' for nil:NilClass 
from (irb):5 
from :0 
irb(main):006:0> ar[0][0]=[rand,rand,rand] 
=> [0.327998120619301, 0.233951721107845, 0.0593579127810733] 
irb(main):007:0> ar[1][0]=[rand,rand,rand] 
=> [0.698779972364559, 0.290838119763321, 0.41685249594095] 
irb(main):008:0> ar[2][0]=[rand,rand,rand] 

和继续填充^矩阵^这种方式。有一个更好的方法吗?

但仍然有,我不能简单地进行操作,如问题:

irb(main):026:0> ar[0][0] 
=> [0.327998120619301, 0.233951721107845, 0.0593579127810733] 
irb(main):027:0> ar[0][1] 
=> [0.360152144966612, 0.611276758393565, 0.0717397147786591] 
irb(main):028:0> ar[0][0]-ar[0][1] 
=> [0.327998120619301, 0.233951721107845, 0.0593579127810733] 

所以我看到的唯一的办法就是从个人索引:

irb(main):032:0> ar[0][0][0]-ar[0][0][1] 
=> 0.094046399511456 
+0

如果没有IRB提示,这样会更容易阅读。 – 2014-10-22 17:24:48

回答

0

有一个Matrix class

require 'matrix' 

m = Matrix[[0,1,0],[1,0,0],[0,1,1]] 
m.det   #=> -1 
m.diagonal? #=> false 
m.trace  #=> 1 

您可以轻松创建随机矩阵:

m = Matrix.build(3,3) { rand } 

注意:矩阵只能提供2d矩阵,如果需要更多维度,则需要自行构建。

+0

但是Matrix类是不可改变的吗? – Vass 2014-10-22 11:09:55

+0

但是,如果你需要,你仍然可以用'm.send(:[] =,x,y,value)更新它',但是不推荐这样做。 – BroiSatse 2014-10-22 11:20:00