File: Tridiag.hs

package info (click to toggle)
haskell-vector 0.6.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 632 kB
  • ctags: 20
  • sloc: haskell: 7,341; ansic: 23; makefile: 2
file content (20 lines) | stat: -rw-r--r-- 575 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module Algo.Tridiag ( tridiag ) where

import Data.Vector.Unboxed as V

tridiag :: (Vector Double, Vector Double, Vector Double, Vector Double)
            -> Vector Double
{-# NOINLINE tridiag #-}
tridiag (as,bs,cs,ds) = xs
    where
      (cs',ds') = V.unzip
                $ V.prescanl' modify (0,0)
                $ V.zip (V.zip as bs) (V.zip cs ds)

      modify (c',d') ((a,b),(c,d)) = 
                   let id = 1 / (b - c'*a)
                   in
                   id `seq` (c*id, (d-d'*a)*id)

      xs = V.prescanr' (\(c,d) x' -> d - c*x') 0 (V.zip cs' ds')