Array<T>* resize(const Array<T> &in, const dim_type odim0, const dim_type odim1, const af_interp_type method) { af::dim4 idims = in.dims(); af::dim4 odims(odim0, odim1, idims[2], idims[3]); // Create output placeholder Array<T> *outArray = createValueArray(odims, (T)0); // Get pointers to raw data const T *inPtr = in.get(); T *outPtr = outArray->get(); af::dim4 ostrides = outArray->strides(); af::dim4 istrides = in.strides(); switch(method) { case AF_INTERP_NEAREST: resize_<T, AF_INTERP_NEAREST>(outPtr, inPtr, odims, idims, ostrides, istrides); break; case AF_INTERP_BILINEAR: resize_<T, AF_INTERP_BILINEAR>(outPtr, inPtr, odims, idims, ostrides, istrides); break; default: break; } return outArray; }
Array<T> diff2(const Array<T> &in, const int dim) { // Bool for dimension bool is_dim0 = dim == 0; bool is_dim1 = dim == 1; bool is_dim2 = dim == 2; bool is_dim3 = dim == 3; // Decrement dimension of select dimension af::dim4 dims = in.dims(); dims[dim] -= 2; // Create output placeholder Array<T> outArray = createValueArray(dims, (T)0); // Get pointers to raw data const T *inPtr = in.get(); T *outPtr = outArray.get(); // TODO: Improve this for(dim_t l = 0; l < dims[3]; l++) { for(dim_t k = 0; k < dims[2]; k++) { for(dim_t j = 0; j < dims[1]; j++) { for(dim_t i = 0; i < dims[0]; i++) { // Operation: out[index] = in[index + 1 * dim_size] - in[index] int idx = getIdx(in.strides(), in.offsets(), i, j, k, l); int jdx = getIdx(in.strides(), in.offsets(), i + is_dim0, j + is_dim1, k + is_dim2, l + is_dim3); int kdx = getIdx(in.strides(), in.offsets(), i + 2 * is_dim0, j + 2 * is_dim1, k + 2 * is_dim2, l + 2 * is_dim3); int odx = getIdx(outArray.strides(), outArray.offsets(), i, j, k, l); outPtr[odx] = inPtr[kdx] + inPtr[idx] - inPtr[jdx] - inPtr[jdx]; } } } } return outArray; }
Array<T> resize(const Array<T> &in, const dim_t odim0, const dim_t odim1, const af_interp_type method) { af::dim4 idims = in.dims(); af::dim4 odims(odim0, odim1, idims[2], idims[3]); // Create output placeholder Array<T> out = createValueArray(odims, (T)0); out.eval(); in.eval(); switch(method) { case AF_INTERP_NEAREST: getQueue().enqueue(kernel::resize<T, AF_INTERP_NEAREST>, out, in); break; case AF_INTERP_BILINEAR: getQueue().enqueue(kernel::resize<T, AF_INTERP_BILINEAR>, out, in); break; case AF_INTERP_LOWER: getQueue().enqueue(kernel::resize<T, AF_INTERP_LOWER>, out, in); break; default: break; } return out; }