@@ -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(
@@ -99,11 +100,19 @@ macro_rules! impl_eig_complex {
99
100
// Hermite conjugate
100
101
if jobvl. is_calc( ) {
101
102
for c in vl. as_mut( ) . unwrap( ) . iter_mut( ) {
102
- c. im = -c. im
103
+ let value = unsafe { c. assume_init_mut( ) } ;
104
+ value. im = -value. im;
103
105
}
104
106
}
105
107
106
- Ok ( ( eigs, vr. or( vl) . unwrap_or( Vec :: new( ) ) ) )
108
+ unsafe {
109
+ Ok ( (
110
+ eigs. assume_init( ) ,
111
+ vr. map( |v| v. assume_init( ) )
112
+ . or( vl. map( |v| v. assume_init( ) ) )
113
+ . unwrap_or( Vec :: new( ) ) ,
114
+ ) )
115
+ }
107
116
}
108
117
}
109
118
} ;
@@ -145,13 +154,13 @@ macro_rules! impl_eig_real {
145
154
} else {
146
155
( EigenVectorFlag :: Not , EigenVectorFlag :: Not )
147
156
} ;
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 ) } ;
157
+ let mut eig_re: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( n as usize ) } ;
158
+ let mut eig_im: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( n as usize ) } ;
150
159
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 ) } ) ;
160
+ let mut vl: Option <Vec <MaybeUninit < Self > >> =
161
+ jobvl. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
162
+ let mut vr: Option <Vec <MaybeUninit < Self > >> =
163
+ jobvr. then( || unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ;
155
164
156
165
// calc work size
157
166
let mut info = 0 ;
@@ -178,7 +187,7 @@ macro_rules! impl_eig_real {
178
187
179
188
// actual ev
180
189
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
181
- let mut work: Vec <Self > = unsafe { vec_uninit ( lwork) } ;
190
+ let mut work: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( lwork) } ;
182
191
let lwork = lwork as i32 ;
183
192
unsafe {
184
193
$ev(
@@ -200,6 +209,11 @@ macro_rules! impl_eig_real {
200
209
} ;
201
210
info. as_lapack_result( ) ?;
202
211
212
+ let eig_re = unsafe { eig_re. assume_init( ) } ;
213
+ let eig_im = unsafe { eig_im. assume_init( ) } ;
214
+ let vl = unsafe { vl. map( |v| v. assume_init( ) ) } ;
215
+ let vr = unsafe { vr. map( |v| v. assume_init( ) ) } ;
216
+
203
217
// reconstruct eigenvalues
204
218
let eigs: Vec <Self :: Complex > = eig_re
205
219
. iter( )
@@ -228,14 +242,14 @@ macro_rules! impl_eig_real {
228
242
229
243
let n = n as usize ;
230
244
let v = vr. or( vl) . unwrap( ) ;
231
- let mut eigvecs = unsafe { vec_uninit ( n * n) } ;
245
+ let mut eigvecs: Vec < MaybeUninit < Self :: Complex >> = unsafe { vec_uninit2 ( n * n) } ;
232
246
let mut col = 0 ;
233
247
while col < n {
234
248
if eig_im[ col] == 0. {
235
249
// The corresponding eigenvalue is real.
236
250
for row in 0 ..n {
237
251
let re = v[ row + col * n] ;
238
- eigvecs[ row + col * n] = Self :: complex( re, 0. ) ;
252
+ eigvecs[ row + col * n] . write ( Self :: complex( re, 0. ) ) ;
239
253
}
240
254
col += 1 ;
241
255
} else {
@@ -247,14 +261,14 @@ macro_rules! impl_eig_real {
247
261
if jobvl. is_calc( ) {
248
262
im = -im;
249
263
}
250
- eigvecs[ row + col * n] = Self :: complex( re, im) ;
251
- eigvecs[ row + ( col + 1 ) * n] = Self :: complex( re, -im) ;
264
+ eigvecs[ row + col * n] . write ( Self :: complex( re, im) ) ;
265
+ eigvecs[ row + ( col + 1 ) * n] . write ( Self :: complex( re, -im) ) ;
252
266
}
253
267
col += 2 ;
254
268
}
255
269
}
256
270
257
- Ok ( ( eigs, eigvecs) )
271
+ unsafe { Ok ( ( eigs, eigvecs. assume_init ( ) ) ) }
258
272
}
259
273
}
260
274
} ;
0 commit comments