我有一个输入mllib
matrix
,
matrix1: org.apache.spark.mllib.linalg.Matrix =
1.0 0.0 2.0 1.0
0.0 3.0 1.0 1.0
2.0 1.0 0.0 0.0
matrix1
的尺寸为3*4
。
我需要将元素matrix
与另一个矩阵相乘,以使两个矩阵的维在所有情况下都相同。让我们假设我还有另一个名为matrix2
的矩阵,例如
matrix2: org.apache.spark.mllib.linalg.Matrix =
3.0 0.0 2.0 1.0
1.0 9.0 5.0 1.0
2.0 5.0 0.0 0.0
,尺寸为3*4
我的结果矩阵应该是
result: org.apache.spark.mllib.linalg.Matrix =
3.0 0.0 4.0 1.0
0.0 27.0 5.0 1.0
4.0 5.0 0.0 0.0
如何在Scala中实现这一目标? (注意:spark multiply
的内置函数mllib
按照精确的矩阵乘法工作。)
答案 0 :(得分:1)
以下是完成此操作的一种方法。在这里,我们对矩阵列均进行了迭代,并找到了它们的元素乘法。该解决方案假定两个矩阵的尺寸相同。
首先,让我们创建有问题的测试矩阵。
//creating example matrix as per the question
val m1: Matrix = new DenseMatrix(3, 4, Array(1.0, 0.0, 2.0, 0.0, 3.0, 1.0, 2.0, 1.0, 0.0, 1.0, 1.0, 0.0))
val m2: Matrix = new DenseMatrix(3, 4, Array(3.0, 1.0, 2.0, 0.0, 9.0, 5.0, 2.0, 5.0, 0.0, 1.0, 1.0, 0.0))
现在让我们定义一个函数,该函数接受两个Matrix
并返回其元素乘法。
//define a function to calculate element wise multiplication
def elemWiseMultiply(m1: Matrix, m2: Matrix): Matrix = {
val arr = new ArrayBuffer[Array[Double]]()
val m1Itr = m1.colIter //operate on each columns
val m2Itr = m2.colIter
while (m1Itr.hasNext)
//zip both the columns and then multiple element by element
arr += m1Itr.next.toArray.zip(m2Itr.next.toArray).map { case (a, b) => a * b }
//return the resultant matrix
new DenseMatrix(m1.numRows, m1.numCols, arr.flatten.toArray)
}
然后可以调用此函数进行元素乘法。
//call the function to m1 and m2
elemWiseMultiply(m1, m2)
//output
//3.0 0.0 4.0 1.0
//0.0 27.0 5.0 1.0
//4.0 5.0 0.0 0.0