假设我有
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
。这是最有效的方法吗?
答案 0 :(得分:4)
最有效的方法是以旧方式进行:循环索引。
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
}
这比transpose.flatten
快约10倍(取决于JVM优化的程度,在我的机器上使用64 x 256阵列的范围为8-18x,如果只有一个,则速度提高50倍)单行,所以transpose.flatten
在展平之前无意义地为每个元素创建一个单元素数组。)
大的性能差异的原因是双重的。首先,我写的方法并没有创建任何中间集合。其次,Array
操作不是专门用于原语的,因此通常会有一些开销。