【问题标题】:How to create a 'matrix' of objects such as arrays/list in Ruby?如何在 Ruby 中创建对象的“矩阵”,例如数组/列表?
【发布时间】:2014-10-22 10:52:12
【问题描述】:

我现在使用Ruby,来自MATLAB 背景。我想创建一个对象矩阵,以便能够像在 MATLAB 中那样执行矩阵/数学风格的索引元素(mat(ii,jj) = some cell object)。我在 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]

并继续以这种方式填充 ^matrix^。有没有更好的方法来做到这一点?

但是还是有我不能轻易进行操作的问题,比如:

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

【问题讨论】:

  • 如果没有 IRB 提示,这将更容易阅读。

标签: ruby arrays matrix irb


【解决方案1】:

有一个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 }

注意:矩阵只能提供二维矩阵,如果您需要更多维度,则需要自己构建。

【讨论】:

  • 有点像,不过如果你需要,你仍然可以用m.send(:[]=, x,y, value)更新它,但不推荐。
猜你喜欢
  • 2017-05-23
  • 1970-01-01
  • 2012-11-25
  • 2015-07-12
  • 2021-06-13
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多