1
假設我有最有效的方式向量化2D陣列中階
val A = Array(Array(1,2,3), Array(4,5,6))
其中每個條目對應於一個矩陣的行。什麼是最有效的矢量化(列方式)到 val vec = Array(1,4,2,5,3,6)
?
我目前正在執行的是val vec = A.transpose.flatten
。這是最有效的方法嗎?
假設我有最有效的方式向量化2D陣列中階
val A = Array(Array(1,2,3), Array(4,5,6))
其中每個條目對應於一個矩陣的行。什麼是最有效的矢量化(列方式)到 val vec = Array(1,4,2,5,3,6)
?
我目前正在執行的是val vec = A.transpose.flatten
。這是最有效的方法嗎?
最有效的方法是以舊的方式:循環遍歷索引。
def transposeFlat(a: Array[Array[Int]]): Array[Int] = {
var n = 0
var i = 0
while (i < a.length) { n += a(i).length; i += 1 }
val b = new Array[Int](n)
val m = n/a.length;
i = 0
var j = 0
while (j < m) {
var k = 0
while (k < a.length) {
b(i) = a(k)(j)
i += 1
k += 1
}
j += 1
}
b
}
這是一個關於比10倍快transpose.flatten
(取決於JVM如何優化的東西,它從8-18x範圍我的機器中將用64×256陣列上,以及多達50倍更快,如果僅僅是一個有單排,因此transpose.flatten
在展平之前爲每個元素無意義地創建了一個單元素數組)。
性能差異較大的原因是雙重的。首先,我寫的方法不創建任何中間集合。其次,Array
操作沒有專門針對基元,因此在一般操作上會有開銷。
你可以編寫你自己的代碼,基於這兩個來做到這一點,但「效率」(你和未來維護者的時間)的另一種衡量方法會爭辯按照你的方式去做,除非和直到你知道這對您的整體表現來說確實是一個關鍵因素。 –
@TheArchetypalPaul - 請記住,這是一個_big_性能差異,但(請參閱我的答案),所以它可能會產生影響。 –
是的。同意。當我看到關於如何使一個孤立的片段「高效」的問題時,我仍然有一個抽搐 - 尤其是當沒有解釋爲什麼效率對於OP的整體應用很重要時。 –