4

我正在使用Breeze库的数学部分并具有以下矩阵:

val matrix = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))

*=我想使用and运算符之一通过标量 Double 来缩放它(并将结果添加到另一个矩阵):*=

val scale = 2.0
val scaled = matrix * scale

这很好用(下面我的答案中有更多详细信息)。

更新 此代码确实可以单独工作。我好像在别处有问题。很抱歉浪费您的带宽...

更新 2但是,如果我专门将类型分配给变量,则代码无法编译Matrixmatrix

val matrix: Matrix[Double] = breeze.linalg.DenseMatrix((1.0,2.0),(3.0,4.0))
val scaled = matrix * scale // does not compile

编译器一直抱怨它“找不到参数 op 的隐式值”。

任何人都可以解释一下吗?这是微风中的错误还是故意的?TIA。

4

1 回答 1

2

对于那些使用 Scala 和 Breeze 库的人,我想在这里详细介绍一些可用于 Matrix 实例的函数/运算符。

我们的出发点是一个简单的Double矩阵(Matrix相关运算也支持Floatand 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
于 2012-08-02T21:00:23.357 回答