Как конвертировать RowMatrix в BDM (Breeze Dense Matrix) и другие вопросы

пытаясь преобразовать RowMatrix в BDM (Breeze Dense Matrix), не знаю, как действовать, необходимо реализовать

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

дополнительный вопрос:

  1. как преобразовать RowMatrix в матрицу?
  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 «умножение», но ему нужен аргумент типа Matrix, скажем, A и B являются RowMatrices, тогда AB = A.multiply(B), это не будет работать, так как B
    RowMatrix, а не Matrix
  5. И, наконец, как преобразовать BDM в RowMatrix?

person novicecoder123    schedule 29.02.2016    source источник
comment
Вы используете scala-breeze? Если это так, вы можете добавить его тег к вопросу.   -  person Sabuncu    schedule 01.03.2016


Ответы (2)


Прочитайте исходный код в 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

    }
person user48135    schedule 02.03.2016

Если у вас нет 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
}

Это параллельно до определенной точки и сделать то же самое.

person Miguel    schedule 09.10.2017