2016-02-29 35 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 
} 

這是平行達到一定的點,做同樣的。