繁体   English   中英

在haskell中使用hmatrix查找向量的范数

[英]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]

编辑:完全相同的库公开了您应该查看的函数scalarscale

(*)假设它的两个参数都具有相同的类型:

(*) :: (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会自动将20.5pi变换为Vector Double

这解释了为什么您的上一个示例没有键入检查。 n具有类型Double ,这意味着它也不可能进行类型检查也可以作为Vector Double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM