| 60 | |
| 61 | template<typename T, typename Tr> |
| 62 | void svdInPlace(Array<Tr> &s, Array<T> &u, Array<T> &vt, Array<T> &in) { |
| 63 | auto func = [=](Param<Tr> s, Param<T> u, Param<T> vt, Param<T> in) { |
| 64 | dim4 iDims = in.dims(); |
| 65 | int M = iDims[0]; |
| 66 | int N = iDims[1]; |
| 67 | |
| 68 | #if defined(USE_MKL) || defined(__APPLE__) |
| 69 | svd_func<T, Tr>()(AF_LAPACK_COL_MAJOR, 'A', M, N, in.get(), |
| 70 | in.strides(1), s.get(), u.get(), u.strides(1), |
| 71 | vt.get(), vt.strides(1)); |
| 72 | #else |
| 73 | std::vector<Tr> superb(std::min(M, N)); |
| 74 | svd_func<T, Tr>()(AF_LAPACK_COL_MAJOR, 'A', 'A', M, N, in.get(), |
| 75 | in.strides(1), s.get(), u.get(), u.strides(1), |
| 76 | vt.get(), vt.strides(1), &superb[0]); |
| 77 | #endif |
| 78 | }; |
| 79 | getQueue().enqueue(func, s, u, vt, in); |
| 80 | } |
| 81 | |
| 82 | template<typename T, typename Tr> |
| 83 | void svd(Array<Tr> &s, Array<T> &u, Array<T> &vt, const Array<T> &in) { |