X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLinear%2FMatrix.hs;h=20769b4708950d103bd0ec1fd18737d9616cb0ca;hb=d05e7a5cec0e76a6ebb4cbc49651211c5a7cf18e;hp=dbd321fefc6e076ade9344495ddfd1c6bd26858c;hpb=c22f72ffaa4edec587b28a7c22aa07330349fd73;p=numerical-analysis.git diff --git a/src/Linear/Matrix.hs b/src/Linear/Matrix.hs index dbd321f..20769b4 100644 --- a/src/Linear/Matrix.hs +++ b/src/Linear/Matrix.hs @@ -17,6 +17,7 @@ where import Data.List (intercalate) import Data.Vector.Fixed ( + (!), N1, N2, N3, @@ -42,7 +43,7 @@ import qualified Data.Vector.Fixed as V ( zipWith ) import Data.Vector.Fixed.Boxed (Vec) -import Data.Vector.Fixed.Internal (Arity, arity) +import Data.Vector.Fixed.Internal.Arity (Arity, arity) import Linear.Vector import Normed @@ -416,9 +417,8 @@ instance (Ring.C a, Arity m, Arity n) => Module.C a (Mat m n a) where instance (Algebraic.C a, ToRational.C a, - Arity m, - Arity n) - => Normed (Mat (S m) (S n) a) where + Arity m) + => Normed (Mat (S m) N1 a) where -- | Generic p-norms. The usual norm in R^n is (norm_p 2). We treat -- all matrices as big vectors. -- @@ -520,3 +520,23 @@ angle v1 v2 = where theta = (recip norms) NP.* (v1 `dot` v2) norms = (norm v1) NP.* (norm v2) + + + +-- | Given a square @matrix@, return a new matrix of the same size +-- containing only the on-diagonal entries of @matrix@. The +-- off-diagonal entries are set to zero. +-- +-- Examples: +-- +-- >>> let m = fromList [[1,2,3],[4,5,6],[7,8,9]] :: Mat3 Int +-- >>> diagonal m +-- ((1,0,0),(0,5,0),(0,0,9)) +-- +diagonal :: (Arity m, Ring.C a) + => Mat m m a + -> Mat m m a +diagonal matrix = + construct lambda + where + lambda i j = if i == j then matrix !!! (i,j) else 0