我正在使用
Breeze库的数学部分并具有以下矩阵:
val matrix = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))
我想用一个标量Double(并将结果添加到另一个Matrix)来缩放它
* =和:* =运算符:
val scale = 2.0
val scaled = matrix * scale
这很好用(我在下面的回答中有更多细节).
更新此代码确实可以独立运行.我好像在其他地方有问题.抱歉浪费你的带宽……
更新2但是,如果我特意将类型Matrix分配给变量矩阵,则代码无法编译:
val matrix: Matrix[Double] = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))
val scaled = matrix * scale // does not compile
编译器一直在抱怨它“找不到参数op的隐含值”.
有人能解释一下吗?这是Breeze或故意的错误吗? TIA.
最佳答案 对于那些与Scala和Breeze库斗争的人,我想详细介绍一下Matrix实例可用的一些函数/运算符.
我们的出发点是一个简单的Double矩阵(Matrix和相关操作也支持Float和Int):
scala> val matrix = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))
你可以轻松地使用它来打印它
scala> println(matrix)
1.0 2.0
3.0 4.0
Breeze支持保持左操作数完整的操作符和修改左操作数的操作符 – 例如*和* =:
scala> val scaled1 = matrix * 2.0 // returns new matrix!
scala> println(matrix)
1.0 2.0
3.0 4.0
scala> println(scaled1)
2.0 4.0
6.0 8.0
scala> println(matrix == scaled1)
false
scala> val scaled2 = matrix *= 2.0 // modifies and returns matrix!
scala> println(matrix)
2.0 4.0
6.0 8.0
scala> println(scaled2)
2.0 4.0
6.0 8.0
scala> println(matrix == scaled2) // rough equivalent of calling Java's equals()
true
两个变量的哈希码表明它们实际上指向同一个对象(根据javadoc为真,可以通过查看源来验证):
scala> println(matrix.##)
12345678
scala> println(scaled2.##)
12345678
这进一步说明如下:
scala> val matrix2 = breeze.linalg.DenseMatrix((2.0,4.0),(6.0,8.0))
scala> println(matrix == matrix2)
true
scala> println(matrix2.##)
34567890