我正试图想出一个方程式来从数学上确定“叠加索引”中数组的“扁平索引”。请注意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]等等的方式。所以我不打算研究那个。
答案 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