summaryrefslogtreecommitdiff
path: root/packages/base/src/Internal/LAPACK.hs
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2015-06-28 20:41:09 +0200
committerAlberto Ruiz <aruiz@um.es>2015-06-28 20:41:09 +0200
commit982b24442018c14510ce9bcf4d0e402613fcbea2 (patch)
tree2de86385d289d5081fdccc75dbc0224469be7ac4 /packages/base/src/Internal/LAPACK.hs
parentc5ed204b8d6a36681c7ec6b227c634bfae501435 (diff)
pass copied slice (eig)
Diffstat (limited to 'packages/base/src/Internal/LAPACK.hs')
-rw-r--r--packages/base/src/Internal/LAPACK.hs37
1 files changed, 20 insertions, 17 deletions
diff --git a/packages/base/src/Internal/LAPACK.hs b/packages/base/src/Internal/LAPACK.hs
index 65deceb..049c11e 100644
--- a/packages/base/src/Internal/LAPACK.hs
+++ b/packages/base/src/Internal/LAPACK.hs
@@ -225,13 +225,14 @@ leftSVAux f st x = unsafePerformIO $ do
225 225
226foreign import ccall unsafe "eig_l_R" dgeev :: R ::> R ::> C :> R ::> Ok 226foreign import ccall unsafe "eig_l_R" dgeev :: R ::> R ::> C :> R ::> Ok
227foreign import ccall unsafe "eig_l_C" zgeev :: C ::> C ::> C :> C ::> Ok 227foreign import ccall unsafe "eig_l_C" zgeev :: C ::> C ::> C :> C ::> Ok
228foreign import ccall unsafe "eig_l_S" dsyev :: CInt -> R ::> R :> R ::> Ok 228foreign import ccall unsafe "eig_l_S" dsyev :: CInt -> R :> R ::> Ok
229foreign import ccall unsafe "eig_l_H" zheev :: CInt -> C ::> R :> C ::> Ok 229foreign import ccall unsafe "eig_l_H" zheev :: CInt -> R :> C ::> Ok
230 230
231eigAux f st m = unsafePerformIO $ do 231eigAux f st m = unsafePerformIO $ do
232 a <- copy ColumnMajor m
232 l <- createVector r 233 l <- createVector r
233 v <- createMatrix ColumnMajor r r 234 v <- createMatrix ColumnMajor r r
234 g # m # l # v #| st 235 g # a # l # v #| st
235 return (l,v) 236 return (l,v)
236 where 237 where
237 r = rows m 238 r = rows m
@@ -241,11 +242,12 @@ eigAux f st m = unsafePerformIO $ do
241-- | Eigenvalues and right eigenvectors of a general complex matrix, using LAPACK's /zgeev/. 242-- | Eigenvalues and right eigenvectors of a general complex matrix, using LAPACK's /zgeev/.
242-- The eigenvectors are the columns of v. The eigenvalues are not sorted. 243-- The eigenvectors are the columns of v. The eigenvalues are not sorted.
243eigC :: Matrix (Complex Double) -> (Vector (Complex Double), Matrix (Complex Double)) 244eigC :: Matrix (Complex Double) -> (Vector (Complex Double), Matrix (Complex Double))
244eigC = eigAux zgeev "eigC" . fmat 245eigC = eigAux zgeev "eigC"
245 246
246eigOnlyAux f st m = unsafePerformIO $ do 247eigOnlyAux f st m = unsafePerformIO $ do
248 a <- copy ColumnMajor m
247 l <- createVector r 249 l <- createVector r
248 g # m # l #| st 250 g # a # l #| st
249 return l 251 return l
250 where 252 where
251 r = rows m 253 r = rows m
@@ -254,22 +256,23 @@ eigOnlyAux f st m = unsafePerformIO $ do
254-- | Eigenvalues of a general complex matrix, using LAPACK's /zgeev/ with jobz == \'N\'. 256-- | Eigenvalues of a general complex matrix, using LAPACK's /zgeev/ with jobz == \'N\'.
255-- The eigenvalues are not sorted. 257-- The eigenvalues are not sorted.
256eigOnlyC :: Matrix (Complex Double) -> Vector (Complex Double) 258eigOnlyC :: Matrix (Complex Double) -> Vector (Complex Double)
257eigOnlyC = eigOnlyAux zgeev "eigOnlyC" . fmat 259eigOnlyC = eigOnlyAux zgeev "eigOnlyC"
258 260
259-- | Eigenvalues and right eigenvectors of a general real matrix, using LAPACK's /dgeev/. 261-- | Eigenvalues and right eigenvectors of a general real matrix, using LAPACK's /dgeev/.
260-- The eigenvectors are the columns of v. The eigenvalues are not sorted. 262-- The eigenvectors are the columns of v. The eigenvalues are not sorted.
261eigR :: Matrix Double -> (Vector (Complex Double), Matrix (Complex Double)) 263eigR :: Matrix Double -> (Vector (Complex Double), Matrix (Complex Double))
262eigR m = (s', v'') 264eigR m = (s', v'')
263 where (s,v) = eigRaux (fmat m) 265 where (s,v) = eigRaux m
264 s' = fixeig1 s 266 s' = fixeig1 s
265 v' = toRows $ trans v 267 v' = toRows $ trans v
266 v'' = fromColumns $ fixeig (toList s') v' 268 v'' = fromColumns $ fixeig (toList s') v'
267 269
268eigRaux :: Matrix Double -> (Vector (Complex Double), Matrix Double) 270eigRaux :: Matrix Double -> (Vector (Complex Double), Matrix Double)
269eigRaux m = unsafePerformIO $ do 271eigRaux m = unsafePerformIO $ do
272 a <- copy ColumnMajor m
270 l <- createVector r 273 l <- createVector r
271 v <- createMatrix ColumnMajor r r 274 v <- createMatrix ColumnMajor r r
272 g # m # l # v #| "eigR" 275 g # a # l # v #| "eigR"
273 return (l,v) 276 return (l,v)
274 where 277 where
275 r = rows m 278 r = rows m
@@ -289,15 +292,15 @@ fixeig _ _ = error "fixeig with impossible inputs"
289-- | Eigenvalues of a general real matrix, using LAPACK's /dgeev/ with jobz == \'N\'. 292-- | Eigenvalues of a general real matrix, using LAPACK's /dgeev/ with jobz == \'N\'.
290-- The eigenvalues are not sorted. 293-- The eigenvalues are not sorted.
291eigOnlyR :: Matrix Double -> Vector (Complex Double) 294eigOnlyR :: Matrix Double -> Vector (Complex Double)
292eigOnlyR = fixeig1 . eigOnlyAux dgeev "eigOnlyR" . fmat 295eigOnlyR = fixeig1 . eigOnlyAux dgeev "eigOnlyR"
293 296
294 297
295----------------------------------------------------------------------------- 298-----------------------------------------------------------------------------
296 299
297eigSHAux f st m = unsafePerformIO $ do 300eigSHAux f st m = unsafePerformIO $ do
298 l <- createVector r 301 l <- createVector r
299 v <- createMatrix ColumnMajor r r 302 v <- copy ColumnMajor m
300 f # m # l # v #| st 303 f # l # v #| st
301 return (l,v) 304 return (l,v)
302 where 305 where
303 r = rows m 306 r = rows m
@@ -307,12 +310,12 @@ eigSHAux f st m = unsafePerformIO $ do
307-- The eigenvalues are sorted in descending order (use 'eigS'' for ascending order). 310-- The eigenvalues are sorted in descending order (use 'eigS'' for ascending order).
308eigS :: Matrix Double -> (Vector Double, Matrix Double) 311eigS :: Matrix Double -> (Vector Double, Matrix Double)
309eigS m = (s', fliprl v) 312eigS m = (s', fliprl v)
310 where (s,v) = eigS' (fmat m) 313 where (s,v) = eigS' m
311 s' = fromList . reverse . toList $ s 314 s' = fromList . reverse . toList $ s
312 315
313-- | 'eigS' in ascending order 316-- | 'eigS' in ascending order
314eigS' :: Matrix Double -> (Vector Double, Matrix Double) 317eigS' :: Matrix Double -> (Vector Double, Matrix Double)
315eigS' = eigSHAux (dsyev 1) "eigS'" . fmat 318eigS' = eigSHAux (dsyev 1) "eigS'"
316 319
317-- | Eigenvalues and right eigenvectors of a hermitian complex matrix, using LAPACK's /zheev/. 320-- | Eigenvalues and right eigenvectors of a hermitian complex matrix, using LAPACK's /zheev/.
318-- The eigenvectors are the columns of v. 321-- The eigenvectors are the columns of v.
@@ -320,23 +323,23 @@ eigS' = eigSHAux (dsyev 1) "eigS'" . fmat
320eigH :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) 323eigH :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double))
321eigH m = (s', fliprl v) 324eigH m = (s', fliprl v)
322 where 325 where
323 (s,v) = eigH' (fmat m) 326 (s,v) = eigH' m
324 s' = fromList . reverse . toList $ s 327 s' = fromList . reverse . toList $ s
325 328
326-- | 'eigH' in ascending order 329-- | 'eigH' in ascending order
327eigH' :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) 330eigH' :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double))
328eigH' = eigSHAux (zheev 1) "eigH'" . fmat 331eigH' = eigSHAux (zheev 1) "eigH'"
329 332
330 333
331-- | Eigenvalues of a symmetric real matrix, using LAPACK's /dsyev/ with jobz == \'N\'. 334-- | Eigenvalues of a symmetric real matrix, using LAPACK's /dsyev/ with jobz == \'N\'.
332-- The eigenvalues are sorted in descending order. 335-- The eigenvalues are sorted in descending order.
333eigOnlyS :: Matrix Double -> Vector Double 336eigOnlyS :: Matrix Double -> Vector Double
334eigOnlyS = vrev . fst. eigSHAux (dsyev 0) "eigS'" . fmat 337eigOnlyS = vrev . fst. eigSHAux (dsyev 0) "eigS'"
335 338
336-- | Eigenvalues of a hermitian complex matrix, using LAPACK's /zheev/ with jobz == \'N\'. 339-- | Eigenvalues of a hermitian complex matrix, using LAPACK's /zheev/ with jobz == \'N\'.
337-- The eigenvalues are sorted in descending order. 340-- The eigenvalues are sorted in descending order.
338eigOnlyH :: Matrix (Complex Double) -> Vector Double 341eigOnlyH :: Matrix (Complex Double) -> Vector Double
339eigOnlyH = vrev . fst. eigSHAux (zheev 0) "eigH'" . fmat 342eigOnlyH = vrev . fst. eigSHAux (zheev 0) "eigH'"
340 343
341vrev = flatten . flipud . reshape 1 344vrev = flatten . flipud . reshape 1
342 345