Допускает ли Эйген спектральное разложение кватернионных матриц?Я пытаюсь сгенерировать матрицы из гауссовского симплектического ансамбля (кватернионные эрмитовы / самосопряженные матрицы), чтобы поэкспериментировать с расстояниями между собственными значениями (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), судя по всему, не имеет поддержки кватернионов.