| 35 | |
| 36 | template<typename T> |
| 37 | static inline uint rank(const af_array in, double tol) { |
| 38 | using BT = typename af::dtype_traits<T>::base_type; |
| 39 | const Array<T> In = getArray<T>(in); |
| 40 | |
| 41 | Array<BT> R = createEmptyArray<BT>(dim4()); |
| 42 | |
| 43 | // Scoping to get rid of q, r and t as they are not necessary |
| 44 | { |
| 45 | Array<T> q = createEmptyArray<T>(dim4()); |
| 46 | Array<T> r = createEmptyArray<T>(dim4()); |
| 47 | Array<T> t = createEmptyArray<T>(dim4()); |
| 48 | qr(q, r, t, In); |
| 49 | using detail::abs; |
| 50 | |
| 51 | R = abs<BT, T>(r); |
| 52 | } |
| 53 | |
| 54 | Array<BT> val = createValueArray<BT>(R.dims(), scalar<BT>(tol)); |
| 55 | Array<char> gt = logicOp<BT, af_gt_t>(R, val, val.dims()); |
| 56 | Array<char> at = reduce<af_or_t, char, char>(gt, 1); |
| 57 | return getScalar<uint>(reduce_all<af_notzero_t, char, uint>(at)); |
| 58 | } |
| 59 | |
| 60 | af_err af_rank(uint* out, const af_array in, const double tol) { |
| 61 | try { |