我正在使用Breeze库的数学部分,并有以下矩阵:
val matrix = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))
我想用一个标量Double来缩放它(并将结果添加到另一个矩阵)*=
和:*=
操作员的
val scale = 2.0
val scaled = matrix * scale
这很好(更多细节请参阅下面的回答)。
更新此代码确实可以单独工作。我似乎在其他地方有问题。很抱歉浪费了你的带宽
更新2但是,如果我将类型Matrix
指定给变量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中的bug还是故意的?TIA。
对于那些在Scala和Breeze库中挣扎的人,我想在这里详细介绍一些可用于矩阵实例的函数/运算符。
我们的起点是一个简单的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