从数组的“堆积索引”中找出“扁平索引”

时间:2011-01-21 23:12:46

标签: ruby math matrix

我正试图想出一个方程式来从数学上确定“叠加索引”中数组的“扁平索引”。请注意Ruby中的以下示例。

matx = [[[ 1, 2, 3, 4],
         [ 5, 6, 7, 8]],

        [[ 9,10,11,12],
         [13,14,15,16]]]

在此示例中,matx是三维矩阵,元素7位于matx[0][1][2]。但是,在下一个例子中:

matx.flatten!  # => [1, 2, 3, 4, 5, 6, 7, 8, 
               #     9, 10, 11, 12, 13, 14, 15, 16]

现在元素7位于matx[6]

基本上,我正在寻找一种方法,给定矩阵的尺寸和特定元素的索引集,从堆叠矩阵转换为扁平矩阵。 反向也很棒,但是我认为得到这个的方法与得到这个结果的方法相似(但基本上是相反的)。我意识到反向实际上不是一个函数,因为没有必须分辨出5是否映射到[2,3]或[3,2]等等的方式。所以我不打算研究那个。

1 个答案:

答案 0 :(得分:2)

class Index
  def initialize *dims
    @dims = dims.reverse
  end

  def if_flat *subs
    raise unless @dims && @dims.size == subs.size
    res = 0
    subs.reverse.each_with_index { |s, i| res += s * @dims[0...i].inject(1) { |m, e| m * e }}
    res
  end
end
puts Index.new(2, 2, 4).if_flat 0, 1, 2