#include <cassert> #include <random> #include <type_traits> #include <hpc/matvec/densevector.h> #include <hpc/matvec/print.h> // // Random initializer for general matrices: real and complex valued // template <typename Index, typename T> void randomInit(Index m, Index n, T *A, Index incRowA, Index incColA) { std::random_device random; std::default_random_engine mt(random()); std::uniform_real_distribution<T> uniform(-100,100); for (Index i=0; i<m; ++i) { for (Index j=0; j<n; ++j) { A[i*incRowA+j*incColA] = uniform(mt); } } } template <typename VX> typename std::enable_if<hpc::matvec::IsDenseVector<VX>::value, void>::type randomInit(VX &x) { typedef typename VX::Index Index; randomInit(x.length, Index(1), x.data, x.inc, Index(1)); } //------------------------------------------------------------------------------ template <typename VX> typename std::enable_if<hpc::matvec::IsDenseVector<VX>::value, void>::type foo(const VX &x) { std::printf("Entering foo\n"); auto y = x(3, 7); auto z = y(0, 4, 2); print(x, "x"); print(y, "y"); print(z, "z"); std::printf("Leaving foo\n"); } int main() { using namespace hpc::matvec; typedef double T; typedef std::size_t Index; DenseVector<T, Index> x(10); auto y = x(3, 7); auto z = y(0, 4, 2); randomInit(x); print(x, "x"); print(y, "y"); print(z, "z"); foo(x); } |