|
2 | 2 | //!
|
3 | 3 | //! [Wikipedia article on SVD](https://en.wikipedia.org/wiki/Singular_value_decomposition)
|
4 | 4 |
|
| 5 | +use crate::{convert::*, error::*, layout::*, types::*}; |
5 | 6 | use ndarray::*;
|
6 | 7 |
|
7 |
| -use super::error::*; |
8 |
| -use super::layout::*; |
9 |
| -use super::types::*; |
10 |
| - |
11 | 8 | /// singular-value decomposition of matrix reference
|
12 | 9 | pub trait SVD {
|
13 | 10 | type U;
|
@@ -98,27 +95,11 @@ where
|
98 | 95 | let l = self.layout()?;
|
99 | 96 | let svd_res = unsafe { A::svd(l, calc_u, calc_vt, self.as_allocated_mut()?)? };
|
100 | 97 | let (n, m) = l.size();
|
101 |
| - let n = n as usize; |
102 |
| - let m = m as usize; |
103 |
| - |
104 |
| - let u = svd_res.u.map(|u| { |
105 |
| - assert_eq!(u.len(), n * n); |
106 |
| - match l { |
107 |
| - MatrixLayout::F { .. } => Array::from_shape_vec((n, n).f(), u), |
108 |
| - MatrixLayout::C { .. } => Array::from_shape_vec((n, n), u), |
109 |
| - } |
110 |
| - .unwrap() |
111 |
| - }); |
112 |
| - |
113 |
| - let vt = svd_res.vt.map(|vt| { |
114 |
| - assert_eq!(vt.len(), m * m); |
115 |
| - match l { |
116 |
| - MatrixLayout::F { .. } => Array::from_shape_vec((m, m).f(), vt), |
117 |
| - MatrixLayout::C { .. } => Array::from_shape_vec((m, m), vt), |
118 |
| - } |
119 |
| - .unwrap() |
120 |
| - }); |
121 | 98 |
|
| 99 | + let u = svd_res.u.map(|u| into_matrix(l.resized(n, n), u).unwrap()); |
| 100 | + let vt = svd_res |
| 101 | + .vt |
| 102 | + .map(|vt| into_matrix(l.resized(m, m), vt).unwrap()); |
122 | 103 | let s = ArrayBase::from(svd_res.s);
|
123 | 104 | Ok((u, s, vt))
|
124 | 105 | }
|
|
0 commit comments