2013-10-16 20 views
5

Sto cercando di utilizzare hmatrix e hmatrix-gsl-stats. Ma sto ottenendo risultati assolutamente bizzarri. Qualcuno può riprodurre quello che sto vedendo?problema ghc con 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 

Così ho solo compilare questo ed eseguirlo, e ottengo:

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) 

mi sto perdendo qualcosa di totalmente ovvio?

+0

Cosa succede se si stampa 'x' e' x3'? Mi chiedo se hanno gli stessi valori, ma dimensioni diverse. (Mi aspetterei comunque che '==' lo capisca, però.) – mhwombat

+0

Sì, sembrano completamente identici. – Victor

risposta

4

Penso che questo sia un problema con il modo in cui la trasposizione della matrice viene gestita internamente. Quando chiami trans, è solo un bit invertito nei metadati ... che è apparentemente non ispezionato quando si passa la matrice attraverso l'FFI.

Se si prova questo, multifit (reshape (cols x) $ flatten x) y, sulla penultima riga, è possibile forzare la trasposizione.

+1

Mi sembra un bug abbastanza serio. Victor dovrebbe lamentarsi con l'autore delle associazioni o l'autore della biblioteca sottostante? –

+0

Sì, 'multifit (risagoma (cols x) $ appiattisci x) y 'fa bene. Ma mi chiedo se qualcuno è riuscito a riprodurre questo? – Victor

+0

Potrei riprodurre il problema e sono d'accordo che si tratta di un bug piuttosto serio. Forse usando 'cmat' invece di' mat' nella [definizione] (https://github.com/amcphail/hmatrix-gsl-stats/blob/master/lib/Numeric/GSL/Fitting/Linear.hs#L137) di 'multifit' sarebbe sufficiente, ma questo problema è probabilmente più diffuso. – Anthony