如何将RowMatrix转换为BDM(Breeze密集矩阵)和更多问题

时间:2016-02-29 19:44:45

标签: scala scala-breeze

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

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

其他问题:

  1. 如何将RowMatrix转换为Matrix?
  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是RowMatices,然后AB = A.multiply(B),这不起作用,因为B
    是RowMatrix而不是Matrix
  5. 最后如何将BDM转换为RowMatrix?

2 个答案:

答案 0 :(得分: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

    }

答案 1 :(得分: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
}

这与某一点并行并且也是如此。