2012-08-02 53 views
4

我使用Breeze庫的數學部分,並具有以下矩陣:如何調整矩陣由雙用微風

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

我想通過一個標量雙縮放這個(並添加結果使用*=:*=運營商之一 另一個矩陣):

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的隱含值」。

任何人都可以解釋這個嗎?這是微風中的錯誤還是故意的? TIA。

+0

一個胡亂猜測,嘗試'VAL比例=規模:* matrix' – pedrofurla 2012-08-02 20:56:31

+0

不工作,要麼... – 2012-08-02 21:02:52

回答

2

對於那些爲Scala和Breeze庫而苦惱的人,我想詳細介紹Matrix實例可用的一些函數/運算符。

我們的出發點是一個簡單的Double矩陣(Matrix和相關操作也支持FloatInt):您可以輕鬆地漂亮地打印此使用

scala> println(matrix) 
1.0 2.0 
3.0 4.0 

微風支持運營商

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

使左操作數保持不變並修改左操作數 - 例如**=

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 
+0

你確定「你可以通過查看它們的哈希碼來驗證這兩個變量實際上是否指向同一個對象」?通常情況並非如此,即相同的哈希碼意味着標識,它通常甚至不意味着相等(http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html#N10184)。 – 2012-08-03 06:37:15

+0

**我的觀點有點合理**排除**(請參閱我的答案的最後部分)。此外,'matrix'和'scaled2'已經檢查是否相等。由於恕我直言唯一的其他數據可能進入哈希碼是內存位置,我假設相同的哈希碼結合成功檢查相等至少是對象身份的指示。 – 2012-08-03 09:17:27

+0

表示 - 也許,但它並不意味着它。請參閱此圖:http://ideone.com/6DyM4 – 2012-08-03 09:56:00