| 28 | |
| 29 | template<typename T> |
| 30 | static inline void svd(af_array *s, af_array *u, af_array *vt, |
| 31 | const af_array in) { |
| 32 | const ArrayInfo &info = getInfo(in); // ArrayInfo is the base class which |
| 33 | dim4 dims = info.dims(); |
| 34 | int M = dims[0]; |
| 35 | int N = dims[1]; |
| 36 | |
| 37 | using Tr = typename dtype_traits<T>::base_type; |
| 38 | |
| 39 | // Allocate output arrays |
| 40 | Array<Tr> sA = createEmptyArray<Tr>(dim4(min(M, N))); |
| 41 | Array<T> uA = createEmptyArray<T>(dim4(M, M)); |
| 42 | Array<T> vtA = createEmptyArray<T>(dim4(N, N)); |
| 43 | |
| 44 | svd<T, Tr>(sA, uA, vtA, getArray<T>(in)); |
| 45 | |
| 46 | *s = getHandle(sA); |
| 47 | *u = getHandle(uA); |
| 48 | *vt = getHandle(vtA); |
| 49 | } |
| 50 | |
| 51 | template<typename T> |
| 52 | static inline void svdInPlace(af_array *s, af_array *u, af_array *vt, |