diff --git a/Eigen/Core b/Eigen/Core index 8627ada53..87e7e9a01 100644 --- a/Eigen/Core +++ b/Eigen/Core @@ -182,6 +182,7 @@ namespace Eigen { #include "src/Core/SolveTriangular.h" #include "src/Core/products/SelfadjointRank2Update.h" #include "src/Core/products/TriangularMatrixVector.h" +#include "src/Core/BandMatrix.h" } // namespace Eigen diff --git a/Eigen/src/Core/SelfAdjointView.h b/Eigen/src/Core/SelfAdjointView.h index 28f44cbbc..a8ea7cd62 100644 --- a/Eigen/src/Core/SelfAdjointView.h +++ b/Eigen/src/Core/SelfAdjointView.h @@ -126,6 +126,40 @@ template class SelfAdjointView const typename MatrixType::Nested m_matrix; }; +template +struct ei_triangular_assignment_selector +{ + enum { + col = (UnrollCount-1) / Derived1::RowsAtCompileTime, + row = (UnrollCount-1) % Derived1::RowsAtCompileTime + }; + + inline static void run(Derived1 &dst, const Derived2 &src) + { + ei_triangular_assignment_selector::run(dst, src); + + if(row == col) + dst.coeffRef(row, col) = ei_real(src.coeff(row, col)); + else if(row < col) + dst.coeffRef(col, row) = ei_conj(dst.coeffRef(row, col) = src.coeff(row, col)); + } +}; + +// selfadjoint to dense matrix +template +struct ei_triangular_assignment_selector +{ + inline static void run(Derived1 &dst, const Derived2 &src) + { + for(int j = 0; j < dst.cols(); ++j) + { + for(int i = 0; i < j; ++i) + dst.coeffRef(j, i) = ei_conj(dst.coeffRef(i, j) = src.coeff(i, j)); + dst.coeffRef(j, j) = ei_real(src.coeff(j, j)); + } + } +}; + /*************************************************************************** * Wrapper to ei_product_selfadjoint_vector ***************************************************************************/ diff --git a/Eigen/src/Core/TriangularMatrix.h b/Eigen/src/Core/TriangularMatrix.h index 506be7965..d2f1e6c28 100644 --- a/Eigen/src/Core/TriangularMatrix.h +++ b/Eigen/src/Core/TriangularMatrix.h @@ -283,7 +283,7 @@ template class TriangularView ***************************************************************************/ template -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { enum { col = (UnrollCount-1) / Derived1::RowsAtCompileTime, @@ -292,39 +292,29 @@ struct ei_part_assignment_impl inline static void run(Derived1 &dst, const Derived2 &src) { - ei_part_assignment_impl::run(dst, src); + ei_triangular_assignment_selector::run(dst, src); - if(Mode == SelfAdjoint) + ei_assert( Mode == UpperTriangular || Mode == LowerTriangular + || Mode == StrictlyUpperTriangular || Mode == StrictlyLowerTriangular + || Mode == UnitUpperTriangular || Mode == UnitLowerTriangular); + if((Mode == UpperTriangular && row <= col) + || (Mode == LowerTriangular && row >= col) + || (Mode == StrictlyUpperTriangular && row < col) + || (Mode == StrictlyLowerTriangular && row > col) + || (Mode == UnitUpperTriangular && row < col) + || (Mode == UnitLowerTriangular && row > col)) + dst.copyCoeff(row, col, src); + else if(ClearOpposite) { - if(row == col) - dst.coeffRef(row, col) = ei_real(src.coeff(row, col)); - else if(row < col) - dst.coeffRef(col, row) = ei_conj(dst.coeffRef(row, col) = src.coeff(row, col)); - } - else - { - ei_assert( Mode == UpperTriangular || Mode == LowerTriangular - || Mode == StrictlyUpperTriangular || Mode == StrictlyLowerTriangular - || Mode == UnitUpperTriangular || Mode == UnitLowerTriangular); - if((Mode == UpperTriangular && row <= col) - || (Mode == LowerTriangular && row >= col) - || (Mode == StrictlyUpperTriangular && row < col) - || (Mode == StrictlyLowerTriangular && row > col) - || (Mode == UnitUpperTriangular && row < col) - || (Mode == UnitLowerTriangular && row > col)) - dst.copyCoeff(row, col, src); - else if(ClearOpposite) - { - if (Mode&UnitDiagBit && row==col) - dst.coeffRef(row, col) = 1; - else - dst.coeffRef(row, col) = 0; - } + if (Mode&UnitDiagBit && row==col) + dst.coeffRef(row, col) = 1; + else + dst.coeffRef(row, col) = 0; } } }; template -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -339,13 +329,13 @@ struct ei_part_assignment_impl }; // prevent buggy user code from causing an infinite recursion template -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &, const Derived2 &) {} }; template -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -360,7 +350,7 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -376,7 +366,7 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -391,7 +381,7 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -407,7 +397,7 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -425,7 +415,7 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl +struct ei_triangular_assignment_selector { inline static void run(Derived1 &dst, const Derived2 &src) { @@ -443,21 +433,6 @@ struct ei_part_assignment_impl -struct ei_part_assignment_impl -{ - inline static void run(Derived1 &dst, const Derived2 &src) - { - for(int j = 0; j < dst.cols(); ++j) - { - for(int i = 0; i < j; ++i) - dst.coeffRef(j, i) = ei_conj(dst.coeffRef(i, j) = src.coeff(i, j)); - dst.coeffRef(j, j) = ei_real(src.coeff(j, j)); - } - } -}; - // FIXME should we keep that possibility template template @@ -484,7 +459,7 @@ void TriangularView::lazyAssign(const MatrixBase <= EIGEN_UNROLLING_LIMIT; ei_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols()); - ei_part_assignment_impl + ei_triangular_assignment_selector ::lazyAssign(const TriangularBase::lazyAssign(const TriangularBase::evalToDenseLazy(MatrixBase &other) c <= EIGEN_UNROLLING_LIMIT; ei_assert(this->rows() == other.rows() && this->cols() == other.cols()); - ei_part_assignment_impl + ei_triangular_assignment_selector ::ExpressionType, Derived::Mode, unroll ? int(DenseDerived::SizeAtCompileTime) : Dynamic, true // clear the opposite triangular part >::run(other.derived(), derived()._expression()); } +/*************************************************************************** +* Implementation of MatrixBase methods +***************************************************************************/ + /** \deprecated use MatrixBase::triangularView() */ template template