2

尝试将 RowMatrix 转换为 BDM(Breeze Dense Matrix),不确定如何进行需要实施

  def getDenseMatrix(A: RowMatrix): BDM[Double] = {
  //write code here
  }

附加问题:

  1. 如何将行矩阵转换为矩阵?
  2. 如何访问 RowMatrix 中的特定行?

    for(i <- 0 to (RowM.numCols().toInt-1)){ //如何访问 RowM.rows(i) }

  3. 如何访问 RowMatrix 中的特定列?

    for(i <- 0 to (RowM.numCols().toInt-1)){ //如何访问 RowM.rows.map(f=>f(i)) }

  4. 如何乘以 2 RowMatrices 注意:RowMatrix 有一个 API 'multiply',但它需要 Matrix 类型的参数说 A 和 B 是 RowMatrices,然后 AB = A.multiply(B),这将不起作用,因为 B
    是 RowMatrix 并且不是矩阵
  5. 最后如何将 BDM 转换为 RowMatrix?
4

2 回答 2

4

阅读rowMatrix中的源代码,你想要源代码,它在私有方法中。代码如下:

 def toBreeze(mat:RowMatrix):BDM[Double] = {
    val m = mat.numRows()
    val n = mat.numCols()
    val result = BDM.zeros[Double](m.toInt,n.toInt)
    var i = 0

    mat.rows.collect().foreach{Vector =>
    Vector.foreachActive { case(index,value) =>
        result(i,index) = value
    }
      i+=1
    }
    result

    }
于 2016-03-02T21:51:12.967 回答
2

如果您没有可用的 foreachActive,请使用以下命令:

def toBreeze(X: RowMatrix): BDM[Double]{
    val m = X.numRows().toInt
    val n = X.numCols().toInt
    val mat = BDM.zeros[Double](m, n)
    var i = 0
    X.rows.collect().map{
      case sp: SparseVector => (sp.indices, sp.values)
      case dp: DenseVector  => (Range(0,n).toArray, dp.values)
    }.foreach {
      case (indices, values) => indices.zip(values).foreach { case (j, v) =>mat(i, j) = v }
      i += 1
    }
    mat
}

这是平行到某一点并做同样的事情。

于 2017-10-09T02:20:23.883 回答