Scala中的逐元素矩阵乘法

时间:2018-07-12 11:12:02

标签: scala apache-spark matrix apache-spark-mllib

我有一个输入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按照精确的矩阵乘法工作。)

1 个答案:

答案 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