Sooooo ......因为事实证明从fake matrices到hmatrix
数据类型变得非常重要:)
序言部分:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ParallelListComp #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
import Numeric.LinearAlgebra.HMatrix
import Numeric.AD
reconstruct :: (Container Vector a, Num (Vector a))
=> [a] -> [Matrix a] -> Matrix a
reconstruct as φs = sum [ a `scale` φ | a <- as | φ <- φs ]
preserveInfo :: (Container Vector a, Num (Vector a))
=> Matrix a -> [a] -> [Matrix a] -> a
preserveInfo img as φs = sumElements (errImg * errImg)
where errImg = img - (reconstruct as φs)
调用gradientDescent
函数:
gradientDescentOverAs :: forall m a. (Floating a, Ord a, Num (Vector a))
=> Matrix a -> [Matrix a] -> [a] -> [[a]]
gradientDescentOverAs img φs as0 = gradientDescent go as0
where go as = preserveInfo img as φs
编辑:这不是原始问题中的代码,但尽可能简化。 GHC需要对go
子功能有一些限制,但链接问题中提出的答案不适用于此。
edit2,从下面引用自己:
我开始相信它无法完成。
Matrix
要求它的元素位于Element
类中。唯一的元素是Double
,Float
和Complex
形式。gradientDescent
不接受所有这些。
所以基本上这与上面链接的问题相同,但对于hmatrix
数据类型而不是我的手动数据类型。
EDIT3
Edward Kmett和Dominic Steinitz之间关于这个话题的相关电子邮件对话:https://mail.haskell.org/pipermail/haskell-cafe/2013-April/107561.html
答案 0 :(得分:1)
我发现这一系列博客文章非常有帮助:
https://idontgetoutmuch.wordpress.com/2014/09/09/fun-with-extended-kalman-filters-4/
(演示了具有静态大小保证的HMatrix和来自AD的jacobian
函数)。
HTH