2016-12-15 37 views
0

在這裏,我用2×1矢量嘗試多一個2x2矩陣中的每個已經從列表創建之後:矢量由斯卡拉矩陣乘法清風

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 

但乘法運算拋出錯誤:

\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 

尺寸是正確的,所以這個錯誤不應該被拋出?

對於這部分錯誤:DenseMatrix[Double],That]應該That是矩陣的返回類型,如果是的話如何設置?

+0

我能找到的每個例子都使用'BDM [Double]'即ie。 'breeze.linalg.DenseMatrix [雙]。你可以在'DenseMatrix [Double]'中顯式設置'dv2'嗎? – javadba

回答

1

dv1 * dv2不是有效的操作,ncol(dv1) = 1 != nrow(dv2) = 2。切換訂單,並使用*運營商給你你想要的:

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)