我有多个相同维度的嵌套数组缓冲区。如何在Scala中对其中两个执行元素矩阵乘法?
我是Scala的新手,在将其转换为mllib库的Matrix数据类型时遇到了问题。有更简单的方法吗?还是我做错了?
您可以使用Breeze,而不是Spark矩阵,因为它是Scala中使用最多的线性代数库。如果你习惯于与Numpy或Scipy一起工作,则与Breeze类似。您可以在中检查所有可用的操作https://github.com/scalanlp/breeze/wiki/Linear-Algebra-Cheat-Sheet.
你可以建立一个密集的矩阵内联:
import breeze.linalg._
val dense1 = DenseMatrix((2,2), (2,2))
val dense2 = DenseMatrix((4,4), (4,4))
并应用元素产品:
println(dense1 *:* dense2)
/* 8 8
8 8 */
如果你有一个数组表示:
val arr1 = Array(Array(2,2), Array(2,2)).flatten
val arr2 = Array(Array(4,4), Array(4,4)).flatten
val dense3 = new DenseMatrix(2,2, arr1)
val dense4 = new DenseMatrix(2,2, arr2)
println(dense3 *:* dense4)
/* 8 8
8 8 */
您需要知道,与Numpy/Pyhton不同,Breeze在编译时检查矩阵类型,因此矩阵必须具有相同的数字表示。它不会在编译时检查矩阵的维度。