/** * Example showing performance of Eigen for sparse/diagonal matrix operations * Compile with * g++-4.9 -O3 -DNDEBUG -fPIC -I -std=c++11 -o eigen_slow_sparse */ #include #include #include #include #include #include typedef double Scalar; typedef Eigen::Array Array; typedef Eigen::DiagonalMatrix DiagonalMatrix; typedef Eigen::SparseMatrix SparseMatrix; typedef std::chrono::high_resolution_clock::time_point time_point; typedef std::chrono::high_resolution_clock::duration duration; #define COMPILER_BARRIER() asm volatile("" ::: "memory") static const Scalar rand_max = static_cast(RAND_MAX); inline time_point getCurrentTime() { return std::chrono::high_resolution_clock::now(); } unsigned long long toMicroSeconds(const duration& tp) { return std::chrono::duration_cast(tp).count(); } double toSeconds(const duration& tp) { return toMicroSeconds(tp)/1000000.0; } inline SparseMatrix generateSparseMatrix(int nx) { SparseMatrix retval(nx, nx); retval.reserve(Eigen::ArrayXi::Ones(nx, 1)); for (SparseMatrix::Index i = 0; i < nx; ++i) { retval.insert(i, i) = rand() / rand_max; } return retval; } inline DiagonalMatrix generateDiagonalMatrix(int nx) { Array vals = Array::Zero(nx); for (int i=0; i