将向量转换为整数

时间:2012-05-01 00:22:57

标签: ruby arrays vector multidimensional-array narray

知道多维数组的向量形状,我们如何将其转换为一维的新向量(通过展平多维数组)?

例如,考虑以下数组:

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维向量转换为1维的新向量?

这是一种特殊情况,因为矢量的原点也是数组的第一个坐标。所以我们可以找到结果:

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

是否有一种简单的方法可以从任何尺寸的数组中平移矢量?感谢。

1 个答案:

答案 0 :(得分:0)

首先,假设数组的第一个元素是X轴,第二个 - 对于Y轴,第三个 - 对于Z轴,你在第二个和第三个例子中有一个错误。第三个例子应该是

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

如果数组的第一个元素是Y轴,第二个 - 对于X轴,那么第二个和第三个例子是正确的,但第一个例子是错误的。

如果我理解了这个想法,我们需要在第一个示例中将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(:+)

更新。更新问题后,它变得更加清晰。如果要保留Ruby的索引顺序,则需要反转数组shapevector

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