module ELynx.Tools.LinearAlgebra
(
matrixSeparateSymSkew,
matrixSetDiagToZero,
dispv,
dispm,
dispmi,
)
where
import Data.List
import Numeric.LinearAlgebra
matrixSeparateSymSkew :: Matrix R -> (Matrix R, Matrix R)
matrixSeparateSymSkew m = (mSym, mSkew)
where
trM = tr m
mSym = scale 0.5 $ m + trM
mSkew = scale 0.5 $ m - trM
matrixSetDiagToZero :: Matrix R -> Matrix R
matrixSetDiagToZero m = m - diag (takeDiag m)
{-# INLINE matrixSetDiagToZero #-}
dispv :: Int -> Vector R -> String
dispv p v = head $ tail $ lines $ dispf p (asRow v)
dispm :: Int -> Matrix R -> String
dispm p m = intercalate "\n" $ init $ lines $ dispf p m
dispmi :: Int -> Int -> Matrix R -> String
dispmi p i m =
intercalate "\n" $ map (replicate i ' ' ++) $ tail $ lines $ dispf p m