Scala中的逐元素矩阵乘法

Scala中的逐元素矩阵乘法,scala,apache-spark,matrix,apache-spark-mllib,Scala,Apache Spark,Matrix,Apache Spark Mllib,我有一个输入mllib矩阵,比如 矩阵1的维数为3*4。 我需要一个元素一个元素的矩阵与另一个矩阵相乘,这样两个矩阵的维数在所有情况下都是相同的。让我们假设我有另一个矩阵,名为matrix2 尺寸为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 mllib内

我有一个输入mllib矩阵,比如

矩阵1的维数为3*4。 我需要一个元素一个元素的矩阵与另一个矩阵相乘,这样两个矩阵的维数在所有情况下都是相同的。让我们假设我有另一个矩阵,名为matrix2

尺寸为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 mllib内置函数乘法按照精确矩阵乘法工作

下面是一种方法。在这里,我们对矩阵进行逐列迭代,并找到它们的元素乘法。此解决方案假设两个矩阵的维数相同。 首先,让我们创建问题中给出的测试矩阵

//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))
现在让我们定义一个函数,它接受两个矩阵并返回它们的元素乘法

//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
然后可以调用此函数进行元素乘法

//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