lapack-0.5.2: src/Numeric/LAPACK/Matrix/Symmetric/Linear.hs
{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Matrix.Symmetric.Linear (
determinant,
) where
import qualified Numeric.LAPACK.Matrix.Symmetric.Unified as Symmetric
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import Numeric.LAPACK.Matrix.Symmetric.Basic (SymmetricP)
import qualified Numeric.Netlib.Class as Class
import qualified Data.Array.Comfort.Shape as Shape
import Foreign.Ptr (Ptr)
import Foreign.Storable (peek)
determinant ::
(Layout.Packing pack, Shape.C sh, Class.Floating a) =>
SymmetricP pack sh a -> a
determinant = Symmetric.determinant peekBlockDeterminant
peekBlockDeterminant ::
(Class.Floating a) => (Ptr a, Maybe (Ptr a, Ptr a)) -> IO a
peekBlockDeterminant (a0Ptr,ext) = do
a0 <- peek a0Ptr
case ext of
Nothing -> return a0
Just (a1Ptr,bPtr) -> do
a1 <- peek a1Ptr
b <- peek bPtr
return (a0*a1 - b*b)