@@ -41,13 +41,14 @@ macro_rules! impl_eig_complex {
41
41
} else {
42
42
( EigenVectorFlag :: Not , EigenVectorFlag :: Not )
43
43
} ;
44
- let mut eigs = unsafe { vec_uninit( n as usize ) } ;
45
- let mut rwork: Vec <Self :: Real > = unsafe { vec_uninit( 2 * n as usize ) } ;
44
+ let mut eigs: Vec <MaybeUninit <Self >> = unsafe { vec_uninit2( n as usize ) } ;
45
+ let mut rwork: Vec <MaybeUninit <Self :: Real >> =
46
+ unsafe { vec_uninit2( 2 * n as usize ) } ;
46
47
47
- let mut vl: Option <Vec <Self >> =
48
- jobvl. then( || unsafe { vec_uninit ( ( n * n) as usize ) } ) ;
49
- let mut vr: Option <Vec <Self >> =
50
- jobvr. then( || unsafe { vec_uninit ( ( n * n) as usize ) } ) ;
48
+ let mut vl: Option <Vec <MaybeUninit < Self > >> =
49
+ jobvl. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
50
+ let mut vr: Option <Vec <MaybeUninit < Self > >> =
51
+ jobvr. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
51
52
52
53
// calc work size
53
54
let mut info = 0 ;
@@ -74,7 +75,7 @@ macro_rules! impl_eig_complex {
74
75
75
76
// actal ev
76
77
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
77
- let mut work: Vec <Self > = unsafe { vec_uninit ( lwork) } ;
78
+ let mut work: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( lwork) } ;
78
79
let lwork = lwork as i32 ;
79
80
unsafe {
80
81
$ev(
@@ -96,10 +97,14 @@ macro_rules! impl_eig_complex {
96
97
} ;
97
98
info. as_lapack_result( ) ?;
98
99
100
+ let eigs = unsafe { eigs. assume_init( ) } ;
101
+ let vr = unsafe { vr. map( |v| v. assume_init( ) ) } ;
102
+ let mut vl = unsafe { vl. map( |v| v. assume_init( ) ) } ;
103
+
99
104
// Hermite conjugate
100
105
if jobvl. is_calc( ) {
101
106
for c in vl. as_mut( ) . unwrap( ) . iter_mut( ) {
102
- c. im = -c. im
107
+ c. im = -c. im;
103
108
}
104
109
}
105
110
@@ -145,13 +150,13 @@ macro_rules! impl_eig_real {
145
150
} else {
146
151
( EigenVectorFlag :: Not , EigenVectorFlag :: Not )
147
152
} ;
148
- let mut eig_re: Vec <Self > = unsafe { vec_uninit ( n as usize ) } ;
149
- let mut eig_im: Vec <Self > = unsafe { vec_uninit ( n as usize ) } ;
153
+ let mut eig_re: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( n as usize ) } ;
154
+ let mut eig_im: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( n as usize ) } ;
150
155
151
- let mut vl: Option <Vec <Self >> =
152
- jobvl. then( || unsafe { vec_uninit ( ( n * n) as usize ) } ) ;
153
- let mut vr: Option <Vec <Self >> =
154
- jobvr. then( || unsafe { vec_uninit ( ( n * n) as usize ) } ) ;
156
+ let mut vl: Option <Vec <MaybeUninit < Self > >> =
157
+ jobvl. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
158
+ let mut vr: Option <Vec <MaybeUninit < Self > >> =
159
+ jobvr. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
155
160
156
161
// calc work size
157
162
let mut info = 0 ;
@@ -178,7 +183,7 @@ macro_rules! impl_eig_real {
178
183
179
184
// actual ev
180
185
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
181
- let mut work: Vec <Self > = unsafe { vec_uninit ( lwork) } ;
186
+ let mut work: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( lwork) } ;
182
187
let lwork = lwork as i32 ;
183
188
unsafe {
184
189
$ev(
@@ -200,6 +205,11 @@ macro_rules! impl_eig_real {
200
205
} ;
201
206
info. as_lapack_result( ) ?;
202
207
208
+ let eig_re = unsafe { eig_re. assume_init( ) } ;
209
+ let eig_im = unsafe { eig_im. assume_init( ) } ;
210
+ let vl = unsafe { vl. map( |v| v. assume_init( ) ) } ;
211
+ let vr = unsafe { vr. map( |v| v. assume_init( ) ) } ;
212
+
203
213
// reconstruct eigenvalues
204
214
let eigs: Vec <Self :: Complex > = eig_re
205
215
. iter( )
@@ -228,14 +238,14 @@ macro_rules! impl_eig_real {
228
238
229
239
let n = n as usize ;
230
240
let v = vr. or( vl) . unwrap( ) ;
231
- let mut eigvecs = unsafe { vec_uninit ( n * n) } ;
241
+ let mut eigvecs: Vec < MaybeUninit < Self :: Complex >> = unsafe { vec_uninit2 ( n * n) } ;
232
242
let mut col = 0 ;
233
243
while col < n {
234
244
if eig_im[ col] == 0. {
235
245
// The corresponding eigenvalue is real.
236
246
for row in 0 ..n {
237
247
let re = v[ row + col * n] ;
238
- eigvecs[ row + col * n] = Self :: complex( re, 0. ) ;
248
+ eigvecs[ row + col * n] . write ( Self :: complex( re, 0. ) ) ;
239
249
}
240
250
col += 1 ;
241
251
} else {
@@ -247,12 +257,13 @@ macro_rules! impl_eig_real {
247
257
if jobvl. is_calc( ) {
248
258
im = -im;
249
259
}
250
- eigvecs[ row + col * n] = Self :: complex( re, im) ;
251
- eigvecs[ row + ( col + 1 ) * n] = Self :: complex( re, -im) ;
260
+ eigvecs[ row + col * n] . write ( Self :: complex( re, im) ) ;
261
+ eigvecs[ row + ( col + 1 ) * n] . write ( Self :: complex( re, -im) ) ;
252
262
}
253
263
col += 2 ;
254
264
}
255
265
}
266
+ let eigvecs = unsafe { eigvecs. assume_init( ) } ;
256
267
257
268
Ok ( ( eigs, eigvecs) )
258
269
}
0 commit comments