diff --git a/Eigen/src/Eigenvalues/EigenSolver.h b/Eigen/src/Eigenvalues/EigenSolver.h index 40830fbdc..f73d58f87 100644 --- a/Eigen/src/Eigenvalues/EigenSolver.h +++ b/Eigen/src/Eigenvalues/EigenSolver.h @@ -319,17 +319,24 @@ template MatrixType EigenSolver::pseudoEigenvalueMatrix() const { eigen_assert(m_isInitialized && "EigenSolver is not initialized."); const RealScalar precision = RealScalar(2) * NumTraits::epsilon(); - Index n = m_eivalues.rows(); + const Index n = m_eivalues.rows(); MatrixType matD = MatrixType::Zero(n, n); - for (Index i = 0; i < n; ++i) { - if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i)), precision)) - matD.coeffRef(i, i) = numext::real(m_eivalues.coeff(i)); - else { - matD.template block<2, 2>(i, i) << numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)), - -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i)); + Index i = 0; + for (; i < n - 1; ++i) { + RealScalar real = numext::real(m_eivalues.coeff(i)); + RealScalar imag = numext::imag(m_eivalues.coeff(i)); + matD.coeffRef(i, i) = real; + if (!internal::isMuchSmallerThan(imag, real, precision)) { + matD.coeffRef(i, i + 1) = imag; + matD.coeffRef(i + 1, i) = -imag; + matD.coeffRef(i + 1, i + 1) = real; ++i; } } + if (i == n - 1) { + matD.coeffRef(i, i) = numext::real(m_eivalues.coeff(i)); + } + return matD; } diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h index 5db563d60..f5172cd8d 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h @@ -177,7 +177,7 @@ struct TensorEvaluator, Device> { // Check if chipping is effectively inner or outer: products of dimensions // before or after the chipped dimension is `1`. Index after_chipped_dim_product = 1; - for (int i = static_cast(m_dim.actualDim()) + 1; i < NumInputDims; ++i) { + for (int i = m_dim.actualDim() + 1; i < NumInputDims; ++i) { after_chipped_dim_product *= input_dims[i]; }