4

Breezeライブラリの数学部分を使用しており、次の行列があります。

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

*=and:*=演算子のいずれかを使用して、これをスカラー Double でスケーリング (および結果を別の Matrix に追加) したい:

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 の暗黙的な値が見つからない」と不平を言い続けます。

誰でもこれを説明できますか?これは Breeze のバグですか、それとも意図的なものですか? ティア。

4

1 に答える 1

2

Scala と Breeze ライブラリに苦労している方のために、Matrix インスタンスで使用できる関数/演算子のいくつかをここで詳しく説明したいと思います。

出発点は単純なDoubleマトリックスです (Matrixそして、関連する操作は と もサポートFloatIntます):

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 は、左のオペランドをそのままにする演算子と、左のオペランドを変更する演算子をサポートしています。たとえば*、 and *=:

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 に答える