2012-05-01 81 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'。我已經更新了我的答案。 –