2013-10-16 33 views
5

我正在嘗試使用hmatrixhmatrix-gsl-stats。但我得到了絕對奇怪的結果。任何人都可以重現我所看到的嗎?ghc與hmatrix問題

import Numeric.LinearAlgebra 
import Numeric.GSL.Fitting.Linear 

main :: IO() 
main = do 
    let y = fromList [1,2,3,4,5] 
    let x = trans $ fromLists [[1,2,3,4,5], [1,1,1,1,1]] 
    let x3 = fromLists [[1,1], [2,1], [3,1], [4,1], [5,1]] 
    print $ x == x3 
    print $ multifit x y 
    print $ multifit x3 y 

所以,我只是這個編譯並運行它,我也得到:

True 
(fromList [0.6121951219512196,0.39756097560975645],(2><2) 
[ 0.5100317271465397, -0.46568114217727535 
, -0.46568114217727535,  0.82048582193139 ],27.27560975609756) 
(fromList [1.0000000000000002,-8.881784197001252e-16],(2><2) 
[ 2.1364982849735737e-32, -6.40949485492072e-32 
, -6.40949485492072e-32, 2.350148113470931e-31 ],6.409494854920721e-31) 

我思念的東西完全明顯?

+0

如果你打印'x'和'x3',會發生什麼?我想知道他們是否有相同的值,但不同的維度。 (不過,我期望'=='可以抓住這個問題。) – mhwombat

+0

是的,它們看起來完全一樣。 – Victor

回答

4

我認爲這是如何在內部處理矩陣換位的問題。當你打電話給trans時,它只是元數據中的一個翻轉位...當通過FFI傳遞矩陣時顯然而不是被檢查。

如果您在倒數第二行嘗試使用multifit (reshape (cols x) $ flatten x) y,您可以強制轉換。

+1

這聽起來像是一個相當嚴重的bug。維克多是否應該抱怨作者或者底層圖書館的作者? –

+0

是的,'multifit(重塑(cols x)$ flatten x)y'是對的。但我想知道是否有人設法重現這一點? – Victor

+0

我可以重現這個問題,我同意這是一個非常嚴重的錯誤。也許在[定義](https://github.com/amcphail/hmatrix-gsl-stats/blob/master/lib/Numeric/GSL/Fitting/Linear.hs#L137)中使用'cmat'而不是'mat', 'multifit'就足夠了,但這個問題可能更廣泛。 – Anthony