summaryrefslogtreecommitdiff
path: root/lib/Data/Packed/Internal/Matrix.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Data/Packed/Internal/Matrix.hs')
-rw-r--r--lib/Data/Packed/Internal/Matrix.hs27
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs
index 86c5915..1c58f6e 100644
--- a/lib/Data/Packed/Internal/Matrix.hs
+++ b/lib/Data/Packed/Internal/Matrix.hs
@@ -385,3 +385,30 @@ fromFile filename (r,c) = do
385 --free charname -- TO DO: free the auxiliary CString 385 --free charname -- TO DO: free the auxiliary CString
386 return res 386 return res
387foreign import ccall "auxi.h matrix_fscanf" c_gslReadMatrix:: Ptr CChar -> TM 387foreign import ccall "auxi.h matrix_fscanf" c_gslReadMatrix:: Ptr CChar -> TM
388
389----------------------------------------------------------------------------
390
391{- | creates a new matrix with the given position updated with a modification function
392
393@> updateMatrix (0,2) (const 57) (ident 3 :: Matrix Double)
394(3><3)
395 [ 1.0, 0.0, 57.0
396 , 0.0, 1.0, 0.0
397 , 0.0, 0.0, 1.0 ]@
398
399-}
400updateMatrix :: Storable t
401 => (Int,Int) -- ^ position (row,column)
402 -> (t -> t) -- ^ modification function
403 -> Matrix t -- ^ source matrix
404 -> Matrix t -- ^ result
405
406updateMatrix (i,j) f (m@MC {rows = r, cols = c, cdat = v})
407 | i<0 || i>=r || j<0 || j>=c = error $ "updateMatrix out of range(size="++show (r,c)++", pos="++show (i,j)++")"
408 | otherwise = let pos = i*c+j
409 in m { cdat = updateVector pos f v }
410
411updateMatrix (i,j) f (m@MF {rows = r, cols = c, fdat = v})
412 | i<0 || i>=r || j<0 || j>=c = error $ "updateMatrix out of range(size="++show (r,c)++", pos="++show (i,j)++")"
413 | otherwise = let pos = j*r+i
414 in m { fdat = updateVector pos f v }