[英]Finding norm of vector using hmatrix in haskell
我刚刚开始学习Haskell,并且在使用hmatrix库时遇到了麻烦。 我想编写一些简单的代码来使用幂迭代方法计算特征值 。 我开始:
c = fromList [4.0, 4.0, 4.0, 4.0]::Vector Double
n = norm2 c
这会创建一个向量c并找到向量的2范数。
乘以c
:
c * 2 (Works)
c * 0.5 (Works)
c * pi (Works)
c * n (Error)
我查了一下:
>:t pi
pi :: Floating a => a
>:t n
n :: Double
问题在于类型,但我不知道如何绕过它。
在这种情况下,我需要定义自己的(/)
函数吗?
更新:我从ghci获得的错误:
Couldn't match expected type `Vector Double'
with actual type `Double'
In the second argument of `(*)', namely `n'
In the expression: c * n
In an equation for `it': it = c * n
你通过检查类型来做正确的事情。 如果我们更明确一点,我们可以看到发生了什么。
Prelude Numeric.LinearAlgebra> :t let a = 2; b = c * a in a
let a = 2; b = c * a in a :: Vector Double
问题是norm2 c
的类型是Double
,因此不能成为Vector Double
让我们看看之前的多态性2
的价值。
Prelude Numeric.LinearAlgebra> let a = 2; b = c * a in a
fromList [2.0]
所以相反, n = fromList [norm2 c]
编辑:完全相同的库公开了您应该查看的函数scalar
和scale
。
(*)
假设它的两个参数都具有相同的类型:
(*) :: (Num a) => a -> a -> a
你的前三次乘法工作的原因是因为在所有三种情况下,正确的参数成功地被检查为Vector Double
!
为了了解原因,让我们问一下ghci
这三个参数的类型是什么:
> :t 2
2 :: Num a => a
> :t 0.5
0.5 :: Fractional a => a
> :t pi
pi :: Floating a => a
所有这三个都是有效的Vector Double
因为hmatrix
提供以下三个实例:
instance Num (Vector Double) where ...
instance Fractional (Vector Double) where ...
instance Floating (Vector Double) where ...
换句话说,由于这些实例,Haskell会自动将2
, 0.5
和pi
变换为Vector Double
。
这解释了为什么您的上一个示例没有键入检查。 n
具有类型Double
,这意味着它也不可能进行类型检查也可以作为Vector Double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.