2016-02-29 34 views
2

试图将一个RowMatrix转化为BDM(微风密集矩阵),不知道如何着手 需要实现如何RowMatrix转换为BDM(微风稠密矩阵)和更多的问题

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

其他问题:

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

    为(ⅰ< - 0到(RowM.numCols()toInt-1)){// 如何访问RowM.rows(ⅰ) }

  3. 如何在访问特定列RowMatrix?

    为(ⅰ< - 0到(RowM.numCols()toInt-1)){// 如何访问RowM.rows.map(F => F(i))的 }

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

你在使用scala-breeze吗?如果是这样,您可能需要将其标记添加到问题中。 – Sabuncu

+0

什么是RowMatrix? – dlwh

回答

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 

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

这是平行达到一定的点,做同样的。