2013-10-16 25 views
5

Tôi đang cố gắng sử dụng hmatrixhmatrix-gsl-stats. Nhưng tôi nhận được kết quả tuyệt vời kỳ lạ. Ai có thể tái sản xuất những gì tôi thấy không?vấn đề ghc với 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 

Vì vậy, tôi chỉ cần biên dịch này và chạy nó, và tôi nhận được:

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) 

Am tôi thiếu một cái gì đó hoàn toàn rõ ràng?

+0

Điều gì sẽ xảy ra nếu bạn in 'x' và' x3'? Tôi tự hỏi nếu họ có cùng giá trị, nhưng kích thước khác nhau. (Tôi mong chờ '==' để bắt được điều đó.) – mhwombat

+0

Vâng, chúng trông hoàn toàn giống hệt nhau. – Victor

Trả lời

4

Tôi nghĩ đây là vấn đề với cách chuyển vị ma trận được xử lý nội bộ. Khi bạn gọi trans, nó chỉ là một chút lộn xộn trong siêu dữ liệu ... rõ ràng là không đang được kiểm tra khi truyền ma trận qua FFI.

Nếu bạn thử điều này, multifit (reshape (cols x) $ flatten x) y, trên đường áp chót, bạn có thể buộc chuyển vị.

+1

Điều đó nghe như một lỗi khá nghiêm trọng đối với tôi. Victor có nên khiếu nại với tác giả của các ràng buộc hoặc tác giả của thư viện cơ bản không? –

+0

Vâng, 'multifit (định hình lại (cols x) $ flatten x) y' có đúng không. Nhưng tôi tự hỏi liệu có ai có thể tái tạo điều này không? – Victor

+0

Tôi có thể tạo lại vấn đề và tôi đồng ý rằng đó là một lỗi khá nghiêm trọng. Có lẽ sử dụng 'cmat' thay vì' mat' trong [định nghĩa] (https://github.com/amcphail/hmatrix-gsl-stats/blob/master/lib/Numeric/GSL/Fitting/Linear.hs#L137) của 'multifit' sẽ là đủ, nhưng vấn đề này có khả năng phổ biến rộng rãi hơn. – Anthony