Eigen + gmp ищет gmp_expr, а не mpq_class - PullRequest
1 голос
/ 31 мая 2019

Я незнаком с шаблонами и C ++ в целом, но хочу начать использовать Eigen с gmp.Я следовал учебнику Eigen по пользовательским типам и хочу выводить на терминал.Я получаю ошибку компиляции, которая ссылается на __gmp_expr <__ mpq_struct [1], __mpq_struct [1]>, но я использую mpq_class.Я не могу решить, что происходит.

Я читаю литературу по gmp, которая убедила меня, что использование gmpxx - это нечто большее, чем я могу понять на данный момент.Мне удалось правильно вывести отдельные матричные элементы и скалярные вычисления (определители) правильно.

Мой заголовочный файл mpfr_type.h основан на учебнике Eigen,

#include <gmpxx.h>
#include <boost/operators.hpp>

namespace Eigen {
  template<> struct NumTraits<mpq_class> : GenericNumTraits<mpq_class>
  {
    typedef mpq_class Real;
    typedef mpq_class NonInteger;
    typedef mpq_class Nested;
    static inline Real epsilon() { return 0; }
    static inline Real dummy_precision() { return 0; }
    static inline Real digits10() { return 0; }
    enum {
      IsInteger = 0,
      IsSigned = 1,
      IsComplex = 0,
      RequireInitialization = 1,
      ReadCost = 6,
      AddCost = 150,
      MulCost = 100
    };
  };
}

, и мой код:

#include <Eigen/Dense>
#include <typeinfo>

#include "mpfr_type.h"

using namespace Eigen;

int main()
{
  // rational matrix
  Matrix<mpq_class,2,2> my_mat;

  my_mat(0,0) = mpq_class (2,3);
  my_mat(0,1) = mpq_class (7,1);
  my_mat(1,0) = mpq_class (5,1);
  my_mat(1,1) = mpq_class (11,1);

  auto my_det = my_mat.determinant();
  std::cout << my_det << std::endl; //works

  std::cout << "Here is my matrix:\n" << my_mat << std::endl; // error
  Return 0;
}

Я просто ожидаю, что мой код скомпилируется, но получу,

g++ -c -g example1.cpp -o example1.o -I ~/Documents/eigen/
In file included from /home/user/Documents/eigen/Eigen/Core:433:0,
                 from /home/user/Documents/eigen/Eigen/Dense:1,
                 from example1.cpp:2:
/home/user/Documents/eigen/Eigen/src/Core/IO.h: In instantiation of ‘static int Eigen::internal::significant_decimals_impl<Scalar>::run() [with Scalar = __gmp_expr<__mpq_struct [1], __mpq_struct [1]>]’:
/home/user/Documents/eigen/Eigen/src/Core/IO.h:155:66:   required from ‘std::ostream& Eigen::internal::print_matrix(std::ostream&, const Derived&, const Eigen::IOFormat&) [with Derived = Eigen::Matrix<__gmp_expr<__mpq_struct [1], __mpq_struct [1]>, 2, 2>; std::ostream = std::basic_ostream<char>]’
/home/user/Documents/eigen/Eigen/src/Core/IO.h:220:32:   required from ‘std::ostream& Eigen::operator<<(std::ostream&, const Eigen::DenseBase<Derived>&) [with Derived = Eigen::Matrix<__gmp_expr<__mpq_struct [1], __mpq_struct [1]>, 2, 2>; std::ostream = std::basic_ostream<char>]’
example1.cpp:44:42:   required from here
/home/user/Documents/eigen/Eigen/src/Core/IO.h:122:40: error: cannot convert ‘Eigen::NumTraits<__gmp_expr<__mpq_struct [1], __mpq_struct [1]> >::Real {aka __gmp_expr<__mpq_struct [1], __mpq_struct [1]>}’ to ‘int’ in return
     return NumTraits<Scalar>::digits10();
                                        ^
Makefile:12: recipe for target 'example1.o' failed
make: *** [example1.o] Error 1

1 Ответ

2 голосов
/ 31 мая 2019

Это была ошибка документации. digits10() должен возвращать целое число.

...