首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向量在Haskell中的值

向量在Haskell中的值
EN

Stack Overflow用户
提问于 2012-07-06 01:20:00
回答 3查看 423关注 0票数 1

我正在试着从向你学习Haskell中学习Haskell以获得更好的效果。我正在尝试构建一组函数来执行各种向量操作。我正在构建一个函数,它接受两个向量,并找到它们之间的角度。操作看起来像这样:A·B=A B cosθ

无论如何,现在我正在尝试编写一个函数,它将找到一个Vector的“值”。例如,2i + 3j + 4k的值是sqrt(2^2 + 3^2 + 4^2)。

向量是以列表的形式存储的,我想尝试一下这样的方法:

代码语言:javascript
运行
复制
getValue (vector) = [sqrt v | v <- v + square take 1 vector]

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-06 01:38:32

通常的名称是“规范”,或者更准确地说是“欧几里德规范”。将各分量的平方相加,并计算总和的平方根。将向量表示为组件列表后,它就变成了

代码语言:javascript
运行
复制
-- assuming the component type is Double
norm :: Vector -> Double
norm vector = sqrt $ sum [x*x | x <- vector]

或者,使用map而不是列表理解,

代码语言:javascript
运行
复制
norm vector = sqrt . sum $ map (\x -> x*x) vector

如果您喜欢无点样式,也可以将后者编写为

代码语言:javascript
运行
复制
norm :: Vector -> Double
norm = sqrt . sum . map (\x -> x*x)
票数 3
EN

Stack Overflow用户

发布于 2012-07-06 06:17:29

首先定义标量乘法,标量乘法本身就很有用。我使用|*|作为运算符:

代码语言:javascript
运行
复制
(|*|) = (sum .) . zipWith (*)

然后剩下的就是微不足道的:

代码语言:javascript
运行
复制
norm v = sqrt $ v |*| v
票数 2
EN

Stack Overflow用户

发布于 2012-07-06 01:38:39

假设您将向量表示为一个列表,那么:

代码语言:javascript
运行
复制
getValue :: (Floating a) => [a] -> a
getValue = sqrt . sum . map (\i -> i * i)

或者,您可以使用列表理解来对值进行平方:

代码语言:javascript
运行
复制
getValue :: (Floating a) => [a] -> a
getValue vector = sqrt . sum $ [x * x | x <- vector]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11349327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档