1

Learn You a Haskell forGreatGoodからHaskellを学ぼうとしています。さまざまなベクトル演算を実行するための関数をたくさん作成しようとしています。2つのベクトルを取り、それらの間の角度を見つける関数を作成しています。操作は次のようになります。A・B=ABcosθ

とにかく、今私はベクトルの「値」を見つける関数を書こうとしています。たとえば、2i + 3j + 4kの値はsqrt(2 ^ 2 + 3 ^ 2 + 4 ^ 2)です。

ベクトルはリストとして保存されており、私は次のようなことを試みることを考えていました。

getValue (vector) = [sqrt v | v <- v + square take 1 vector]

どうすればいいですか?

4

3 に答える 3

3

これの通常の名前は「ノルム」、より正確には「ユークリッドノルム」です。コンポーネントの二乗を合計し、合計の平方根を計算します。コンポーネントのリストとして表されるベクトルを使用すると、次のようになります。

-- assuming the component type is Double
norm :: Vector -> Double
norm vector = sqrt $ sum [x*x | x <- vector]

または、mapリスト内包表記の代わりに、

norm vector = sqrt . sum $ map (\x -> x*x) vector

ポイントフリースタイルが好きな場合は、後者を次のように書くこともできます

norm :: Vector -> Double
norm = sqrt . sum . map (\x -> x*x)
于 2012-07-05T17:38:31.847 に答える
2

最初にスカラー乗法を定義します。これはそれ自体で役立ちます。私|*|は演算子として使用しました:

(|*|) = (sum .) . zipWith (*)

その後、残りは取るに足らないです:

norm v = sqrt $ v |*| v
于 2012-07-05T22:17:29.043 に答える
1

ベクトルをリストとして表現していると仮定すると、次のようになります。

getValue :: (Floating a) => [a] -> a
getValue = sqrt . sum . map (\i -> i * i)

または、リスト内包表記を使用して、値の2乗を行うことができます。

getValue :: (Floating a) => [a] -> a
getValue vector = sqrt . sum $ [x * x | x <- vector]
于 2012-07-05T17:38:39.207 に答える