2016-12-15 3 views
0

Hier bin ich von 2x1 Vector mehrere 2x2 Matrix versucht, nach jeder hat aus Listen erstellt:Vector von Matrixmultiplikation in Scala Brise

val x1 = List[Double](1.0,2.0); 
val x2 = List[List[Double]](List(1,2) , List(3,4)); 
val dv1 = DenseVector[Double]((x1.toArray):_*) 
val dv2 = DenseMatrix(((x2).toArray):_*) 
val h = dv1 :* dv2 

Aber die Multiplikationsoperation wirft Fehler:

\Main.scala:50: could not find implicit value for parameter op: breeze.linalg.operators.OpMulScalar.Impl2[breeze.linalg.DenseVector[Double],breeze.linalg.DenseMatrix[Double],That] 
[error] val h = dv1 :* dv2 

Die Abmessungen sind korrekt, daher sollte dieser Fehler nicht ausgelöst werden?

Für diesen Teil des Fehlers: DenseMatrix[Double],That] sollte That der Rückgabetyp der Matrix sein, wenn ja, wie zu setzen?

+0

Jedes Beispiel, das ich finden konnte, Anwendungen 'BDM [Double]' dh. 'breeze.linalg.DenseMatrix [Double]. Kannst du 'dv2' explizit in' DenseMatrix [Double] 'machen? – javadba

Antwort

1

dv1 * dv2 ist kein gültiger Vorgang, ncol(dv1) = 1 != nrow(dv2) = 2. Umschalten der Reihenfolge und mit dem * Operator gibt Ihnen, was Sie wollen:

scala> import breeze.linalg._ 
import breeze.linalg._ 

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

val x1 = List[Double](1.0,2.0); 
val x2 = List[List[Double]](List(1,2) , List(3,4)); 
val dv1 = DenseVector[Double]((x1.toArray):_*) 
val dv2 = DenseMatrix(((x2).toArray):_*) 

// Exiting paste mode, now interpreting. 

x1: List[Double] = List(1.0, 2.0) 
x2: List[List[Double]] = List(List(1.0, 2.0), List(3.0, 4.0)) 
dv1: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 2.0) 
dv2: breeze.linalg.DenseMatrix[Double] = 
1.0 2.0 
3.0 4.0 

scala> dv1 * dv2 
java.lang.IllegalArgumentException: requirement failed: b.rows == 1 (2 != 1) 
    at breeze.linalg.operators.DenseMatrixMultiplyStuff$$anon$36.apply(DenseMatrixOps.scala:100) 
    at breeze.linalg.operators.DenseMatrixMultiplyStuff$$anon$36.apply(DenseMatrixOps.scala:98) 
    at breeze.linalg.ImmutableNumericOps$class.$times(NumericOps.scala:135) 
    at breeze.linalg.DenseVector.$times(DenseVector.scala:51) 
    ... 43 elided 

scala> dv2 * dv1 
res2: breeze.linalg.DenseVector[Double] = DenseVector(5.0, 11.0)