// Benchmarks for matrix logarithm. // Inverse of matrix exponential, used for Lie group log maps. #include #include #include using namespace Eigen; #ifndef SCALAR #define SCALAR double #endif typedef SCALAR Scalar; static void BM_MatrixLog(benchmark::State& state) { int n = state.range(0); typedef Matrix MatrixType; // Generate a matrix close to identity for stable log computation. MatrixType A = MatrixType::Identity(n, n) + MatrixType::Random(n, n) / Scalar(n * 2); // Ensure A is in the principal branch by computing exp(small matrix). A = (MatrixType::Random(n, n) / Scalar(n * 4)).exp(); MatrixType result(n, n); for (auto _ : state) { result = A.log(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } template static void BM_MatrixLog_Fixed(benchmark::State& state) { typedef Matrix MatrixType; MatrixType A = (MatrixType::Random() / Scalar(N * 4)).exp(); MatrixType result; for (auto _ : state) { result = A.log(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } BENCHMARK(BM_MatrixLog)->Arg(2)->Arg(3)->Arg(4)->Arg(8)->Arg(16)->Arg(32)->Arg(64); BENCHMARK(BM_MatrixLog_Fixed<2>); BENCHMARK(BM_MatrixLog_Fixed<3>); BENCHMARK(BM_MatrixLog_Fixed<4>);