| 57 | |
| 58 | template<typename T> |
| 59 | void qr(Array<T> &q, Array<T> &r, Array<T> &t, const Array<T> &in) { |
| 60 | dim4 iDims = in.dims(); |
| 61 | int M = iDims[0]; |
| 62 | int N = iDims[1]; |
| 63 | |
| 64 | const dim4 NullShape(0, 0, 0, 0); |
| 65 | |
| 66 | dim4 endPadding(M - iDims[0], max(M, N) - iDims[1], 0, 0); |
| 67 | q = (endPadding == NullShape |
| 68 | ? copyArray(in) |
| 69 | : padArrayBorders(in, NullShape, endPadding, AF_PAD_ZERO)); |
| 70 | q.resetDims(iDims); |
| 71 | t = qr_inplace(q); |
| 72 | |
| 73 | // SPLIT into q and r |
| 74 | dim4 rdims(M, N); |
| 75 | r = createEmptyArray<T>(rdims); |
| 76 | |
| 77 | mapped_ptr<T> qPtr = q.getMappedPtr(); |
| 78 | mapped_ptr<T> rPtr = r.getMappedPtr(); |
| 79 | mapped_ptr<T> tPtr = t.getMappedPtr(); |
| 80 | |
| 81 | triangle<T, true, false>(rPtr.get(), qPtr.get(), rdims, r.strides(), |
| 82 | q.strides()); |
| 83 | |
| 84 | gqr_func<T>()(AF_LAPACK_COL_MAJOR, M, M, min(M, N), qPtr.get(), |
| 85 | q.strides()[1], tPtr.get()); |
| 86 | |
| 87 | q.resetDims(dim4(M, M)); |
| 88 | } |
| 89 | |
| 90 | template<typename T> |
| 91 | Array<T> qr_inplace(Array<T> &in) { |
nothing calls this directly
no test coverage detected