2012-05-01 79 views
0

了解多维数组的矢量形状,我们如何将它转换为一维的新矢量(通过拼合多维数组)?将矢量转换为整数

例如考虑以下的数组:

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,我们怎么可能转化载体?换句话说,如何将这个三维向量转化为一维的新向量?

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

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 

但这里是一个更复杂的cated例如,具有负向量:

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 

有一种简单的方法来平坦的载体从任何尺寸的阵列?谢谢。

+0

您能否给一个相关的链接来解释vector2index函数。 – nightf0x

+0

有没有简单的方法来解释你的问题?谢谢。 –

+0

@ nightf0x&marc-andre-lafortune,谢谢你的评论。我刚刚重写了我的问题,试图更清楚。 – Doug

回答

0

首先,假设阵列的第一个元素是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(:+) 
+0

非常感谢,@riateche。我目前正在看你的解决方案。我承认我对矢量错误有怀疑;因为在逻辑上,在第二个例子中,矢量“AB”等于“B”的坐标。然而,考虑到'arr [1,0] =“B”',这个坐标是'[1,0]'。 – Doug

+0

经过考虑,我认为轴线可能是一个角度问题。对于Ruby,(显示2个dim的数组),X轴是垂直的(并且它下降)。但对于我们人类来说,这个垂直轴按照惯例是Y轴。为了我的需要,我会优先考虑在Ruby的角度使用您的解决方案。我们如何更新您的实施?再次感谢。 – Doug

+0

您需要反转阵列'shape'和'vector'。我已经更新了我的答案。 –