在 Scala 中将 Matrix 的对角线值替换为 1

Replace Diagonal values of Matrix to 1 in Scala

我有一个 mllib 矩阵,

mat: org.apache.spark.mllib.linalg.Matrix =
0.0  2.0  1.0  2.0
2.0  0.0  2.0  4.0
1.0  2.0  0.0  3.0
2.0  4.0  3.0  0.0

根据我的 Scala 代码,matrix 的对角线是 0.0。我需要将此值替换为 1.0,例如

mat: org.apache.spark.mllib.linalg.Matrix =
1.0  2.0  1.0  2.0
2.0  1.0  2.0  4.0
1.0  2.0  1.0  3.0
2.0  4.0  3.0  1.0

我怎样才能做到这一点?请给我一个优化的解决方案。

要更改对角线,您需要将矩阵转换为行迭代器,以便您可以对其进行迭代,然后使用索引压缩此迭代器以根据索引替换每行上的元素,索引是矩阵。以下是带有所需注释的代码。

import org.apache.spark.mllib.linalg.DenseMatrix

//creating initial matrix which needs to be changes
val arr = Array(0.0,2.0,1.0,2.0,2.0,0.0,2.0,4.0,1.0,2.0,0.0,3.0,2.0,4.0,3.0,0.0)
val mat = new DenseMatrix(4,4,arr)

//output
//0.0  2.0  1.0  2.0
//2.0  0.0  2.0  4.0
//1.0  2.0  0.0  3.0
//2.0  4.0  3.0  0.0

//make the iterator and change the element at the index of each row
val changedArr = mat.rowIter.zipWithIndex.flatMap(x => {
  val ar = x._1.toArray
  ar(x._2) = 1.0
  ar
}).toArray

//create new matrix from it
val changedMat = new DenseMatrix(mat.numRows, mat.numCols, changedArr)

//output
//1.0  2.0  1.0  2.0
//2.0  1.0  2.0  4.0
//1.0  2.0  1.0  3.0
//2.0  4.0  3.0  1.0