向量转换为整数(Convert vector to integer)

2019-09-16 21:59发布

了解向量的多维数组的形状,我们如何才能将它转换成一维的新载体(由扁平化多维数组)?

例如考虑下面的数组:

arr = [
  [
    [ nil, nil ],
    [ nil, nil ],
    [ nil, nil ]
  ],
  [
    [ nil, nil ],
    [ nil, nil ],
    [ nil, nil ]
  ]
]

arr[0][0][0] = "A"
arr[1][0][1] = "B"

arr # =>
[
  [
    [ "A", nil ],
    [ nil, nil ],
    [ nil, nil ]
  ],
  [
    [ nil, "B" ],
    [ nil, nil ],
    [ nil, nil ]
  ]
]

...其中A是原点和B是矢量的目的地。 可以这样写:

shape  = [2, 3, 2]
vector = [1, 0, 1]

从目前来看,假设我们扁平化arr ,我们怎么能翻译的载体? 换句话说,如何3个维度的该矢量转换成一维的一个新的?

这是一种特殊情况下,因为矢量的原点也是阵列的第一坐标。 因此,我们可以发现,其结果:

arr.flatten.index("B") # => 7

下面是与2D阵列的另一种示例:

arr = [
  [ "A", nil ],
  [ "B", nil ],
  [ nil, nil ],
  [ nil, nil ],
  [ nil, nil ]
]

我们可以这样写:

shape  = [2, 5]
vector = [1, 0]

而且,再一次,

arr.flatten.index("B") # => 2

但这里是一个比较复杂的例子,有一个负矢量:

arr = [
  [ "B", nil ],
  [ "A", nil ],
  [ nil, nil ],
  [ nil, nil ],
  [ nil, nil ]
]

shape  = [2, 5]
vector = [-1, 0]

如何能在下面的方法可以写?

vector2index(shape, vector) # => -2

一个例子(简单)用1D阵列:

arr = [ nil, "B", nil, nil, "A", nil, nil ]

shape  = [7]
vector = [-3]
vector2index(shape, vector) # => -3

有一个简单的方法来平坦从任何尺寸的阵列的矢量? 谢谢。

Answer 1:

首先,假设阵列的那个第一个元素为X轴,第二 - 为Y轴,第三 - 为Z轴,则必须在第二和第三个例子是一个错误。 第三个例子应该是

shape  = [2,5]
vector = [0,-1]
vector2index(shape, vector) # => -2

如果数组的第一元素为Y轴,第二 - 为X轴,然后加入2-次和第3次实施例是正确的,但第一示例是错误的。

如果我正确理解的想法,我们需要在第一个例子中乘以vector[1]shape[0]vector[2]shape[0]*shape[1]然后计算3种元素的总和。 一般情况下,我们并不需要乘以0个元素,我们需要乘以n个元素来shape[0]*shape[1]*...*shape[n-1]

您可以实现这种方式:

vector.each_with_index.map { 
  |v, i| i == 0? v: v * shape[0..i-1].inject(:*) 
}.inject(:+)

UPD。 你更新你的问题后,它变得更加清晰。 如果您想保留Ruby的索引顺序,你需要扭转两个阵列shapevector

vector.reverse.each_with_index.map { 
  |v, i| i == 0? v: v * shape[0..i-1].reverse.inject(:*) 
}.inject(:+)


文章来源: Convert vector to integer