scala – 如何用微风来缩放矩阵

我正在使用
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
点赞