Решение кватернионных эрмитовых матриц с использованием собственных - PullRequest
0 голосов
/ 08 февраля 2019

Допускает ли Эйген спектральное разложение кватернионных матриц?Я пытаюсь сгенерировать матрицы из гауссовского симплектического ансамбля (кватернионные эрмитовы / самосопряженные матрицы), чтобы поэкспериментировать с расстояниями между собственными значениями (Wigner Surmise), но после того, как я некоторое время возился, я не уверен, как это сделать.

Нужно ли расширять класс MatrixBase с помощью плагина кватерниона, чтобы получить поддержку кватернионной матрицы, а затем передать матрицу в SelfAdjointEigenSolver впоследствии?

В настоящее время я только пробовал использовать Matrix<Quaternion<double>, Dynamic, Dynamic> и подача этого прямо в SelfAdjointEigenSolver.Это привело к clang выплевыванию стены ошибок, большинство из которых просто кажутся пропущенными жалобами оператора.

Дамп ошибок:

/usr/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h:434:11: error: invalid operands to binary expression
      ('Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Eigen::Quaternion<double, 0>, -1, -1, 0, -1, -1> >::RealScalar'
      (aka 'Eigen::Quaternion<double, 0>') and 'Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Eigen::Quaternion<double, 0>, -1, -1, 0, -1,
      -1> >::RealScalar')
  if(scale==RealScalar(0)) scale = RealScalar(1);

...

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.1/../../../../include/c++/8.2.1/bits/stl_algobase.h:224:15: error: invalid operands to
      binary expression ('const Eigen::Quaternion<double, 0>' and 'const Eigen::Quaternion<double, 0>')
      if (__a < __b)
...

/usr/include/eigen3/Eigen/src/Core/functors/BinaryFunctors.h:361:128: error: invalid operands to binary expression
      ('const Eigen::Quaternion<double, 0>' and 'const Eigen::Quaternion<double, 0>')
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }

...

/usr/include/eigen3/Eigen/src/Core/TriangularMatrix.h:769:89: error: no matching conversion for functional-style cast from 'int' to
      'Eigen::internal::triangular_dense_assignment_kernel<1, 0, 0,
      Eigen::internal::evaluator<Eigen::TriangularView<Eigen::Matrix<Eigen::Quaternion<double, 0>, -1, -1, 0, -1, -1>, 1> >,
      Eigen::internal::evaluator<Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<Eigen::Quaternion<double, 0>,
      Eigen::Quaternion<double, 0> >, const Eigen::Matrix<Eigen::Quaternion<double, 0>, -1, -1, 0, -1, -1>, const
      Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<Eigen::Quaternion<double, 0> >, const
      Eigen::Matrix<Eigen::Quaternion<double, 0>, -1, -1, 0, -1, -1> > > >, Eigen::internal::assign_op<Eigen::Quaternion<double, 0>,
      Eigen::Quaternion<double, 0> >, 0>::Scalar' (aka 'Eigen::Quaternion<double, 0>')
         if(Mode==UnitDiag && SetOpposite) m_functor.assignCoeff(m_dst.coeffRef(id,id), Scalar(1));

...

/usr/include/eigen3/Eigen/src/Eigenvalues/./Tridiagonalization.h:365:31: error: no viable overloaded '='
    matA.col(i).coeffRef(i+1) = 1;

(and then a ton more)

Мне не удалось найти ничего изпоиск.Моя предыдущая библиотека по линейной алгебре (Armadillo), судя по всему, не имеет поддержки кватернионов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...