@@ -40,11 +40,11 @@ pub struct EigWork<T: Scalar> {
40
40
pub jobvl : JobEv ,
41
41
42
42
/// Eigenvalues used in complex routines
43
- pub eigs : Option < Vec < MaybeUninit < T > > > ,
43
+ pub eigs : Option < Vec < MaybeUninit < T :: Complex > > > ,
44
44
/// Real part of eigenvalues used in real routines
45
- pub eigs_re : Option < Vec < MaybeUninit < T > > > ,
45
+ pub eigs_re : Option < Vec < MaybeUninit < T :: Real > > > ,
46
46
/// Imaginary part of eigenvalues used in real routines
47
- pub eigs_im : Option < Vec < MaybeUninit < T > > > ,
47
+ pub eigs_im : Option < Vec < MaybeUninit < T :: Real > > > ,
48
48
49
49
/// Left eigenvectors
50
50
pub vl : Option < Vec < MaybeUninit < T > > > ,
@@ -57,6 +57,26 @@ pub struct EigWork<T: Scalar> {
57
57
pub rwork : Option < Vec < MaybeUninit < T :: Real > > > ,
58
58
}
59
59
60
+ impl < T : Scalar > EigWork < T > {
61
+ /// Create complex eigenvalues from real and imaginary parts.
62
+ unsafe fn reconstruct_eigs ( & mut self ) {
63
+ let n = self . n as usize ;
64
+ if self . eigs . is_none ( ) {
65
+ self . eigs = Some ( vec_uninit ( n) ) ;
66
+ }
67
+ let eigs = self . eigs . as_mut ( ) . unwrap ( ) ;
68
+ if let ( Some ( re) , Some ( im) ) = ( self . eigs_re . as_ref ( ) , self . eigs_im . as_ref ( ) ) {
69
+ assert_eq ! ( re. len( ) , n) ;
70
+ assert_eq ! ( im. len( ) , n) ;
71
+ for i in 0 ..n {
72
+ eigs[ i] . write ( T :: complex ( re[ i] . assume_init ( ) , im[ i] . assume_init ( ) ) ) ;
73
+ }
74
+ } else {
75
+ panic ! ( "Called without constructing eigs_re and eigs_im" ) ;
76
+ }
77
+ }
78
+ }
79
+
60
80
pub trait EigWorkImpl : Sized {
61
81
type Elem : Scalar ;
62
82
/// Create new working memory for eigenvalues compution.
0 commit comments