【问题标题】:Convert vector to integer将向量转换为整数
【发布时间】:2012-05-10 15:39:28
【问题描述】:

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

例如考虑以下数组:

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

这是另一个二维数组的例子:

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

一维数组的示例(简单):

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

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

有没有一种简单的方法可以从任意维度的数组中扁平化一个向量?谢谢。

【问题讨论】:

  • 能否给个相关的链接来解释vector2index函数。
  • 有没有简单的方法来解释你的问题?谢谢。
  • @nightf0x & marc-andre-lafortune,感谢您的 cmets。我只是重写了我的问题,试图更清楚。

标签: ruby arrays vector multidimensional-array narray


【解决方案1】:

首先,假设数组的第一个元素用于 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(:+)

【讨论】:

  • 非常感谢,@riateche。我目前正在关注您的解决方案。我承认我对矢量错误有疑问;因为逻辑上,在第二个例子中,向量AB 等于B 的坐标。然而,这个坐标是[1, 0],因为arr [1, 0] = "B".
  • 经过考虑,我认为轴可能是一个视角问题。对于 Ruby,(显示 2 个暗淡的数组)X 轴是垂直的(并且向下)。但是对于我们人类来说,这个垂直轴通常是 Y 轴。出于我的需要,我更愿意从 Ruby 的角度使用您的解决方案。我们如何更新您的实现来做到这一点?再次感谢。
  • 您需要反转两个数组shapevector。我已经更新了我的答案。
猜你喜欢
  • 2018-06-26
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多