#include #include #include #include using namespace Eigen; typedef float Scalar; static void BM_SelfAdjointEigenSolver(benchmark::State& state) { int n = state.range(0); typedef Matrix MatrixType; MatrixType a = MatrixType::Random(n, n); MatrixType covMat = a * a.adjoint(); int r = internal::random(0, n - 1); int c = internal::random(0, n - 1); Scalar acc = 0; SelfAdjointEigenSolver ei(covMat); for (auto _ : state) { ei.compute(covMat); acc += ei.eigenvectors().coeff(r, c); benchmark::DoNotOptimize(acc); } } BENCHMARK(BM_SelfAdjointEigenSolver)->RangeMultiplier(2)->Range(4, 512); static void BM_EigenSolver(benchmark::State& state) { int n = state.range(0); typedef Matrix MatrixType; MatrixType a = MatrixType::Random(n, n); MatrixType covMat = a * a.adjoint(); int r = internal::random(0, n - 1); int c = internal::random(0, n - 1); Scalar acc = 0; EigenSolver ei(covMat); for (auto _ : state) { ei.compute(covMat); acc += std::norm(ei.eigenvectors().coeff(r, c)); benchmark::DoNotOptimize(acc); } } BENCHMARK(BM_EigenSolver)->RangeMultiplier(2)->Range(4, 512);