| 55 | |
| 56 | template<typename T, typename Tr> |
| 57 | void svdInPlace(Array<Tr> &s, Array<T> &u, Array<T> &vt, Array<T> &in) { |
| 58 | dim4 iDims = in.dims(); |
| 59 | int M = iDims[0]; |
| 60 | int N = iDims[1]; |
| 61 | |
| 62 | mapped_ptr<Tr> sPtr = s.getMappedPtr(); |
| 63 | mapped_ptr<T> uPtr = u.getMappedPtr(); |
| 64 | mapped_ptr<T> vPtr = vt.getMappedPtr(); |
| 65 | mapped_ptr<T> iPtr = in.getMappedPtr(); |
| 66 | |
| 67 | #if defined(USE_MKL) || defined(__APPLE__) |
| 68 | svd_func<T, Tr>()(AF_LAPACK_COL_MAJOR, 'A', M, N, iPtr.get(), |
| 69 | in.strides()[1], sPtr.get(), uPtr.get(), u.strides()[1], |
| 70 | vPtr.get(), vt.strides()[1]); |
| 71 | #else |
| 72 | std::vector<Tr> superb(std::min(M, N)); |
| 73 | svd_func<T, Tr>()(AF_LAPACK_COL_MAJOR, 'A', 'A', M, N, iPtr.get(), |
| 74 | in.strides()[1], sPtr.get(), uPtr.get(), u.strides()[1], |
| 75 | vPtr.get(), vt.strides()[1], &superb[0]); |
| 76 | #endif |
| 77 | } |
| 78 | |
| 79 | template<typename T, typename Tr> |
| 80 | void svd(Array<Tr> &s, Array<T> &u, Array<T> &vt, const Array<T> &in) { |