@@ -39,20 +39,20 @@ macro_rules! impl_svddc {
3939 let m = l. lda( ) ;
4040 let n = l. len( ) ;
4141 let k = m. min( n) ;
42- let mut s = unsafe { vec_uninit ( k as usize ) } ;
42+ let mut s = unsafe { vec_uninit2 ( k as usize ) } ;
4343
4444 let ( u_col, vt_row) = match jobz {
4545 UVTFlag :: Full | UVTFlag :: None => ( m, n) ,
4646 UVTFlag :: Some => ( k, k) ,
4747 } ;
4848 let ( mut u, mut vt) = match jobz {
4949 UVTFlag :: Full => (
50- Some ( unsafe { vec_uninit ( ( m * m) as usize ) } ) ,
51- Some ( unsafe { vec_uninit ( ( n * n) as usize ) } ) ,
50+ Some ( unsafe { vec_uninit2 ( ( m * m) as usize ) } ) ,
51+ Some ( unsafe { vec_uninit2 ( ( n * n) as usize ) } ) ,
5252 ) ,
5353 UVTFlag :: Some => (
54- Some ( unsafe { vec_uninit ( ( m * u_col) as usize ) } ) ,
55- Some ( unsafe { vec_uninit ( ( n * vt_row) as usize ) } ) ,
54+ Some ( unsafe { vec_uninit2 ( ( m * u_col) as usize ) } ) ,
55+ Some ( unsafe { vec_uninit2 ( ( n * vt_row) as usize ) } ) ,
5656 ) ,
5757 UVTFlag :: None => ( None , None ) ,
5858 } ;
@@ -64,12 +64,12 @@ macro_rules! impl_svddc {
6464 UVTFlag :: None => 7 * mn,
6565 _ => std:: cmp:: max( 5 * mn* mn + 5 * mn, 2 * mx* mn + 2 * mn* mn + mn) ,
6666 } ;
67- let mut $rwork_ident: Vec <Self :: Real > = unsafe { vec_uninit ( lrwork) } ;
67+ let mut $rwork_ident: Vec <MaybeUninit < Self :: Real >> = unsafe { vec_uninit2 ( lrwork) } ;
6868 ) *
6969
7070 // eval work size
7171 let mut info = 0 ;
72- let mut iwork = unsafe { vec_uninit ( 8 * k as usize ) } ;
72+ let mut iwork: Vec < MaybeUninit < i32 >> = unsafe { vec_uninit2 ( 8 * k as usize ) } ;
7373 let mut work_size = [ Self :: zero( ) ] ;
7474 unsafe {
7575 $gesdd(
@@ -86,15 +86,15 @@ macro_rules! impl_svddc {
8686 AsPtr :: as_mut_ptr( & mut work_size) ,
8787 & ( -1 ) ,
8888 $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
89- iwork . as_mut_ptr( ) ,
89+ AsPtr :: as_mut_ptr( & mut iwork ) ,
9090 & mut info,
9191 ) ;
9292 }
9393 info. as_lapack_result( ) ?;
9494
9595 // do svd
9696 let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
97- let mut work: Vec <Self > = unsafe { vec_uninit ( lwork) } ;
97+ let mut work: Vec <MaybeUninit < Self >> = unsafe { vec_uninit2 ( lwork) } ;
9898 unsafe {
9999 $gesdd(
100100 jobz. as_ptr( ) ,
@@ -110,12 +110,16 @@ macro_rules! impl_svddc {
110110 AsPtr :: as_mut_ptr( & mut work) ,
111111 & ( lwork as i32 ) ,
112112 $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
113- iwork . as_mut_ptr( ) ,
113+ AsPtr :: as_mut_ptr( & mut iwork ) ,
114114 & mut info,
115115 ) ;
116116 }
117117 info. as_lapack_result( ) ?;
118118
119+ let s = unsafe { s. assume_init( ) } ;
120+ let u = u. map( |v| unsafe { v. assume_init( ) } ) ;
121+ let vt = vt. map( |v| unsafe { v. assume_init( ) } ) ;
122+
119123 match l {
120124 MatrixLayout :: F { .. } => Ok ( SVDOutput { s, u, vt } ) ,
121125 MatrixLayout :: C { .. } => Ok ( SVDOutput { s, u: vt, vt: u } ) ,
0 commit comments