forked from pz4kybsvg/Conception
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.6 KiB
42 lines
1.6 KiB
// TODO(jwnimmer-tri) Write our own formatting logic instead of using Eigen IO,
|
|
// and add customization flags for how to display the matrix data.
|
|
#undef EIGEN_NO_IO
|
|
#include "drake/common/fmt_eigen.h"
|
|
|
|
#include <limits>
|
|
#include <sstream>
|
|
|
|
namespace drake {
|
|
namespace internal {
|
|
|
|
template <typename T>
|
|
using FormatterEigenRef =
|
|
Eigen::Ref<const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
|
|
|
|
template <typename T>
|
|
std::string FormatEigenMatrix(const FormatterEigenRef<T>& matrix) {
|
|
std::stringstream stream;
|
|
// We'll print our matrix data using as much precision as we can, so that
|
|
// console log output and/or error messages paint the full picture. Sadly,
|
|
// the ostream family of floating-point formatters doesn't know how to do
|
|
// "shortest round-trip precision". If we set the precision to max_digits,
|
|
// then simple numbers like "1.1" print as "1.1000000000000001"; instead,
|
|
// we'll use max_digits - 1 to avoid that problem, with the risk of losing
|
|
// the last ulps in the printout in case we needed that last digit. This
|
|
// will all be fixed once we stop using Eigen IO.
|
|
stream.precision(std::numeric_limits<double>::max_digits10 - 1);
|
|
stream << matrix;
|
|
return stream.str();
|
|
}
|
|
|
|
// Explicitly instantiate for the allowed scalar types in our header.
|
|
template std::string FormatEigenMatrix<double>(
|
|
const FormatterEigenRef<double>& matrix);
|
|
template std::string FormatEigenMatrix<float>(
|
|
const FormatterEigenRef<float>& matrix);
|
|
template std::string FormatEigenMatrix<std::string>(
|
|
const FormatterEigenRef<std::string>& matrix);
|
|
|
|
} // namespace internal
|
|
} // namespace drake
|