@@ -21,7 +21,7 @@ pub trait QR_: Sized {
21
21
macro_rules! impl_qr {
22
22
( $scalar: ty, $qrf: path, $lqf: path, $gqr: path, $glq: path) => {
23
23
impl QR_ for $scalar {
24
- fn householder( l: MatrixLayout , mut a: & mut [ Self ] ) -> Result <Vec <Self >> {
24
+ fn householder( l: MatrixLayout , a: & mut [ Self ] ) -> Result <Vec <Self >> {
25
25
let m = l. lda( ) ;
26
26
let n = l. len( ) ;
27
27
let k = m. min( n) ;
@@ -33,41 +33,59 @@ macro_rules! impl_qr {
33
33
unsafe {
34
34
match l {
35
35
MatrixLayout :: F { .. } => {
36
- $qrf( m, n, & mut a, m, & mut tau, & mut work_size, -1 , & mut info) ;
36
+ $qrf(
37
+ & m,
38
+ & n,
39
+ AsPtr :: as_mut_ptr( a) ,
40
+ & m,
41
+ AsPtr :: as_mut_ptr( & mut tau) ,
42
+ AsPtr :: as_mut_ptr( & mut work_size) ,
43
+ & ( -1 ) ,
44
+ & mut info,
45
+ ) ;
37
46
}
38
47
MatrixLayout :: C { .. } => {
39
- $lqf( m, n, & mut a, m, & mut tau, & mut work_size, -1 , & mut info) ;
48
+ $lqf(
49
+ & m,
50
+ & n,
51
+ AsPtr :: as_mut_ptr( a) ,
52
+ & m,
53
+ AsPtr :: as_mut_ptr( & mut tau) ,
54
+ AsPtr :: as_mut_ptr( & mut work_size) ,
55
+ & ( -1 ) ,
56
+ & mut info,
57
+ ) ;
40
58
}
41
59
}
42
60
}
43
61
info. as_lapack_result( ) ?;
44
62
45
63
// calc
46
64
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
47
- let mut work = unsafe { vec_uninit( lwork) } ;
65
+ let mut work: Vec < Self > = unsafe { vec_uninit( lwork) } ;
48
66
unsafe {
49
67
match l {
50
68
MatrixLayout :: F { .. } => {
51
69
$qrf(
52
- m,
53
- n,
54
- & mut a ,
55
- m,
56
- & mut tau,
57
- & mut work,
58
- lwork as i32 ,
70
+ & m,
71
+ & n,
72
+ AsPtr :: as_mut_ptr ( a ) ,
73
+ & m,
74
+ AsPtr :: as_mut_ptr ( & mut tau) ,
75
+ AsPtr :: as_mut_ptr ( & mut work) ,
76
+ & ( lwork as i32 ) ,
59
77
& mut info,
60
78
) ;
61
79
}
62
80
MatrixLayout :: C { .. } => {
63
81
$lqf(
64
- m,
65
- n,
66
- & mut a ,
67
- m,
68
- & mut tau,
69
- & mut work,
70
- lwork as i32 ,
82
+ & m,
83
+ & n,
84
+ AsPtr :: as_mut_ptr ( a ) ,
85
+ & m,
86
+ AsPtr :: as_mut_ptr ( & mut tau) ,
87
+ AsPtr :: as_mut_ptr ( & mut work) ,
88
+ & ( lwork as i32 ) ,
71
89
& mut info,
72
90
) ;
73
91
}
@@ -78,7 +96,7 @@ macro_rules! impl_qr {
78
96
Ok ( tau)
79
97
}
80
98
81
- fn q( l: MatrixLayout , mut a: & mut [ Self ] , tau: & [ Self ] ) -> Result <( ) > {
99
+ fn q( l: MatrixLayout , a: & mut [ Self ] , tau: & [ Self ] ) -> Result <( ) > {
82
100
let m = l. lda( ) ;
83
101
let n = l. len( ) ;
84
102
let k = m. min( n) ;
@@ -89,26 +107,58 @@ macro_rules! impl_qr {
89
107
let mut work_size = [ Self :: zero( ) ] ;
90
108
unsafe {
91
109
match l {
92
- MatrixLayout :: F { .. } => {
93
- $gqr( m, k, k, & mut a, m, & tau, & mut work_size, -1 , & mut info)
94
- }
95
- MatrixLayout :: C { .. } => {
96
- $glq( k, n, k, & mut a, m, & tau, & mut work_size, -1 , & mut info)
97
- }
110
+ MatrixLayout :: F { .. } => $gqr(
111
+ & m,
112
+ & k,
113
+ & k,
114
+ AsPtr :: as_mut_ptr( a) ,
115
+ & m,
116
+ AsPtr :: as_ptr( & tau) ,
117
+ AsPtr :: as_mut_ptr( & mut work_size) ,
118
+ & ( -1 ) ,
119
+ & mut info,
120
+ ) ,
121
+ MatrixLayout :: C { .. } => $glq(
122
+ & k,
123
+ & n,
124
+ & k,
125
+ AsPtr :: as_mut_ptr( a) ,
126
+ & m,
127
+ AsPtr :: as_ptr( & tau) ,
128
+ AsPtr :: as_mut_ptr( & mut work_size) ,
129
+ & ( -1 ) ,
130
+ & mut info,
131
+ ) ,
98
132
}
99
133
} ;
100
134
101
135
// calc
102
136
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
103
- let mut work = unsafe { vec_uninit( lwork) } ;
137
+ let mut work: Vec < Self > = unsafe { vec_uninit( lwork) } ;
104
138
unsafe {
105
139
match l {
106
- MatrixLayout :: F { .. } => {
107
- $gqr( m, k, k, & mut a, m, & tau, & mut work, lwork as i32 , & mut info)
108
- }
109
- MatrixLayout :: C { .. } => {
110
- $glq( k, n, k, & mut a, m, & tau, & mut work, lwork as i32 , & mut info)
111
- }
140
+ MatrixLayout :: F { .. } => $gqr(
141
+ & m,
142
+ & k,
143
+ & k,
144
+ AsPtr :: as_mut_ptr( a) ,
145
+ & m,
146
+ AsPtr :: as_ptr( & tau) ,
147
+ AsPtr :: as_mut_ptr( & mut work) ,
148
+ & ( lwork as i32 ) ,
149
+ & mut info,
150
+ ) ,
151
+ MatrixLayout :: C { .. } => $glq(
152
+ & k,
153
+ & n,
154
+ & k,
155
+ AsPtr :: as_mut_ptr( a) ,
156
+ & m,
157
+ AsPtr :: as_ptr( & tau) ,
158
+ AsPtr :: as_mut_ptr( & mut work) ,
159
+ & ( lwork as i32 ) ,
160
+ & mut info,
161
+ ) ,
112
162
}
113
163
}
114
164
info. as_lapack_result( ) ?;
@@ -127,29 +177,29 @@ macro_rules! impl_qr {
127
177
128
178
impl_qr ! (
129
179
f64 ,
130
- lapack :: dgeqrf ,
131
- lapack :: dgelqf ,
132
- lapack :: dorgqr ,
133
- lapack :: dorglq
180
+ lapack_sys :: dgeqrf_ ,
181
+ lapack_sys :: dgelqf_ ,
182
+ lapack_sys :: dorgqr_ ,
183
+ lapack_sys :: dorglq_
134
184
) ;
135
185
impl_qr ! (
136
186
f32 ,
137
- lapack :: sgeqrf ,
138
- lapack :: sgelqf ,
139
- lapack :: sorgqr ,
140
- lapack :: sorglq
187
+ lapack_sys :: sgeqrf_ ,
188
+ lapack_sys :: sgelqf_ ,
189
+ lapack_sys :: sorgqr_ ,
190
+ lapack_sys :: sorglq_
141
191
) ;
142
192
impl_qr ! (
143
193
c64,
144
- lapack :: zgeqrf ,
145
- lapack :: zgelqf ,
146
- lapack :: zungqr ,
147
- lapack :: zunglq
194
+ lapack_sys :: zgeqrf_ ,
195
+ lapack_sys :: zgelqf_ ,
196
+ lapack_sys :: zungqr_ ,
197
+ lapack_sys :: zunglq_
148
198
) ;
149
199
impl_qr ! (
150
200
c32,
151
- lapack :: cgeqrf ,
152
- lapack :: cgelqf ,
153
- lapack :: cungqr ,
154
- lapack :: cunglq
201
+ lapack_sys :: cgeqrf_ ,
202
+ lapack_sys :: cgelqf_ ,
203
+ lapack_sys :: cungqr_ ,
204
+ lapack_sys :: cunglq_
155
205
) ;
0 commit comments