diff options
author | Alberto Ruiz <aruiz@um.es> | 2015-06-28 20:41:09 +0200 |
---|---|---|
committer | Alberto Ruiz <aruiz@um.es> | 2015-06-28 20:41:09 +0200 |
commit | 982b24442018c14510ce9bcf4d0e402613fcbea2 (patch) | |
tree | 2de86385d289d5081fdccc75dbc0224469be7ac4 /packages/base/src/Internal/LAPACK.hs | |
parent | c5ed204b8d6a36681c7ec6b227c634bfae501435 (diff) |
pass copied slice (eig)
Diffstat (limited to 'packages/base/src/Internal/LAPACK.hs')
-rw-r--r-- | packages/base/src/Internal/LAPACK.hs | 37 |
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 | ||
226 | foreign import ccall unsafe "eig_l_R" dgeev :: R ::> R ::> C :> R ::> Ok | 226 | foreign import ccall unsafe "eig_l_R" dgeev :: R ::> R ::> C :> R ::> Ok |
227 | foreign import ccall unsafe "eig_l_C" zgeev :: C ::> C ::> C :> C ::> Ok | 227 | foreign import ccall unsafe "eig_l_C" zgeev :: C ::> C ::> C :> C ::> Ok |
228 | foreign import ccall unsafe "eig_l_S" dsyev :: CInt -> R ::> R :> R ::> Ok | 228 | foreign import ccall unsafe "eig_l_S" dsyev :: CInt -> R :> R ::> Ok |
229 | foreign import ccall unsafe "eig_l_H" zheev :: CInt -> C ::> R :> C ::> Ok | 229 | foreign import ccall unsafe "eig_l_H" zheev :: CInt -> R :> C ::> Ok |
230 | 230 | ||
231 | eigAux f st m = unsafePerformIO $ do | 231 | eigAux 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. |
243 | eigC :: Matrix (Complex Double) -> (Vector (Complex Double), Matrix (Complex Double)) | 244 | eigC :: Matrix (Complex Double) -> (Vector (Complex Double), Matrix (Complex Double)) |
244 | eigC = eigAux zgeev "eigC" . fmat | 245 | eigC = eigAux zgeev "eigC" |
245 | 246 | ||
246 | eigOnlyAux f st m = unsafePerformIO $ do | 247 | eigOnlyAux 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. |
256 | eigOnlyC :: Matrix (Complex Double) -> Vector (Complex Double) | 258 | eigOnlyC :: Matrix (Complex Double) -> Vector (Complex Double) |
257 | eigOnlyC = eigOnlyAux zgeev "eigOnlyC" . fmat | 259 | eigOnlyC = 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. |
261 | eigR :: Matrix Double -> (Vector (Complex Double), Matrix (Complex Double)) | 263 | eigR :: Matrix Double -> (Vector (Complex Double), Matrix (Complex Double)) |
262 | eigR m = (s', v'') | 264 | eigR 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 | ||
268 | eigRaux :: Matrix Double -> (Vector (Complex Double), Matrix Double) | 270 | eigRaux :: Matrix Double -> (Vector (Complex Double), Matrix Double) |
269 | eigRaux m = unsafePerformIO $ do | 271 | eigRaux 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. |
291 | eigOnlyR :: Matrix Double -> Vector (Complex Double) | 294 | eigOnlyR :: Matrix Double -> Vector (Complex Double) |
292 | eigOnlyR = fixeig1 . eigOnlyAux dgeev "eigOnlyR" . fmat | 295 | eigOnlyR = fixeig1 . eigOnlyAux dgeev "eigOnlyR" |
293 | 296 | ||
294 | 297 | ||
295 | ----------------------------------------------------------------------------- | 298 | ----------------------------------------------------------------------------- |
296 | 299 | ||
297 | eigSHAux f st m = unsafePerformIO $ do | 300 | eigSHAux 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). |
308 | eigS :: Matrix Double -> (Vector Double, Matrix Double) | 311 | eigS :: Matrix Double -> (Vector Double, Matrix Double) |
309 | eigS m = (s', fliprl v) | 312 | eigS 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 |
314 | eigS' :: Matrix Double -> (Vector Double, Matrix Double) | 317 | eigS' :: Matrix Double -> (Vector Double, Matrix Double) |
315 | eigS' = eigSHAux (dsyev 1) "eigS'" . fmat | 318 | eigS' = 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 | |||
320 | eigH :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) | 323 | eigH :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) |
321 | eigH m = (s', fliprl v) | 324 | eigH 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 |
327 | eigH' :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) | 330 | eigH' :: Matrix (Complex Double) -> (Vector Double, Matrix (Complex Double)) |
328 | eigH' = eigSHAux (zheev 1) "eigH'" . fmat | 331 | eigH' = 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. |
333 | eigOnlyS :: Matrix Double -> Vector Double | 336 | eigOnlyS :: Matrix Double -> Vector Double |
334 | eigOnlyS = vrev . fst. eigSHAux (dsyev 0) "eigS'" . fmat | 337 | eigOnlyS = 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. |
338 | eigOnlyH :: Matrix (Complex Double) -> Vector Double | 341 | eigOnlyH :: Matrix (Complex Double) -> Vector Double |
339 | eigOnlyH = vrev . fst. eigSHAux (zheev 0) "eigH'" . fmat | 342 | eigOnlyH = vrev . fst. eigSHAux (zheev 0) "eigH'" |
340 | 343 | ||
341 | vrev = flatten . flipud . reshape 1 | 344 | vrev = flatten . flipud . reshape 1 |
342 | 345 | ||