[Haskell-cafe] Re: Purely funcional LU decomposition
Neal Alexander
wqeqweuqy at hotmail.com
Wed Feb 4 02:15:49 EST 2009
Array is no good man! Quad Tree matrices perform much nicer from what
I've seen.
I wrote some matrix stuff based on D. Stott Parker's "Randomized
Gaussian elimination" papers (http://www.cs.ucla.edu/~stott/ge/). He
presents some recursive block based methods of solving without pivoting.
I want to upload the full library to Hackage, but it'd be nice to have
some people look through it before - mainly because i never took linear
algebra heh. QuickCheck seems to be holding things together though.
Check these definitions (where the input matrix has been pre-transformed
with the butterfly if needed -- revertRBT . invert . applyRBT):
gauss (M.Scalar v) = (M.Scalar 1, M.Scalar v)
gauss (M.Matrix (a,b,c,d)) = (M.Matrix (l, M.Scalar 0, x, l'),
M.Matrix (u, y, M.Scalar 0, u'))
where
(l,u) = gauss a
(l',u') = gauss $ d - (x * y)
x = c * (invert u)
y = (invert l) * b
invert (M.Scalar v) = M.Scalar (1 / v)
invert (M.Matrix (a,b,c,d)) = M.Matrix (w,x,y,z)
where
w = aI - (aIb * y)
x = negate $ aIb * z
y = negate $ z * caI
z = invert $ d - (caI * b)
-----------
aI = invert a
caI = c * aI
aIb = aI * b
benchmarked against (in order of speed):
1. Mesa GL math in C called through FFI.
2. Finger tree based port.
3. Mutable array based port.
2 and 3 were scrapped right away.
Heres some of the benchmark vs the C version.
------------------------------------
Matrix Inversion - 999999999x
------------------------------------
------- haskell ------------
ContextSwitches - 224017
First level fills = 0
Second level fills = 0
ETime( 0:00:41.328 ) UTime( 0:00:40.875 ) KTime( 0:00:00.000 )
ITime( 0:00:41.484 )
---------- C ---------------
ContextSwitches - 640016
First level fills = 0
Second level fills = 0
ETime( 0:01:56.109 ) UTime( 0:01:55.359 ) KTime( 0:00:00.000 )
ITime( 0:01:54.328 )
------------------------------------
Matrix Inversion - 9999999x
------------------------------------
------- haskell ------------
ContextSwitches - 6204
First level fills = 0
Second level fills = 0
ETime( 0:00:00.687 ) UTime( 0:00:00.421 ) KTime( 0:00:00.000 )
ITime( 0:00:01.031 )
---------- C ---------------
ContextSwitches - 7396
First level fills = 0
Second level fills = 0
ETime( 0:00:01.171 ) UTime( 0:00:01.171 ) KTime( 0:00:00.000 )
ITime( 0:00:01.250 )
-------------------------------------
Matrix multiplication - 999999999x
-------------------------------------
------- haskell ------------
ContextSwitches - 234644
First level fills = 0
Second level fills = 0
ETime( 0:00:42.093 ) UTime( 0:00:41.609 ) KTime( 0:00:00.000 )
ITime( 0:00:42.187 )
---------- C ---------------
ContextSwitches - 228596
First level fills = 0
Second level fills = 0
ETime( 0:00:41.609 ) UTime( 0:00:41.375 ) KTime( 0:00:00.000 )
ITime( 0:00:41.515 )
More information about the Haskell-Cafe
mailing list