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)
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