10 #ifndef EIGEN_COMPANION_H
11 #define EIGEN_COMPANION_H
24 #ifndef EIGEN_PARSED_BY_DOXYGEN
33 template <
typename Scalar_,
int Deg_>
67 template <
typename VectorType>
69 const Index deg = poly.size() - 1;
70 m_monic = -poly.head(deg) / poly[deg];
74 template <
typename VectorType>
82 const Index deg_1 = deg - 1;
85 BottomLeftBlock::Identity(deg - 1, deg - 1) *
m_bl_diag.asDiagonal())
124 template <
typename Scalar_,
int Deg_>
139 rowB = rowNorm / radix;
145 while (scout < rowB) {
152 scout = colNorm * (colB / radix) * colB;
153 while (scout >= rowNorm) {
159 if ((rowNorm + radix * scout) <
RealScalar(0.95) *
s * colB) {
169 template <
typename Scalar_,
int Deg_>
181 rowB =
sqrt(colNorm / rowNorm);
192 template <
typename Scalar_,
int Deg_>
196 const Index deg = m_monic.size();
197 const Index deg_1 = deg - 1;
199 bool hasConverged =
false;
200 while (!hasConverged) {
207 colNorm =
abs(m_bl_diag[0]);
208 rowNorm =
abs(m_monic[0]);
211 if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
212 m_bl_diag[0] *= colB;
220 colNorm =
abs(m_bl_diag[
i]);
223 rowNorm =
abs(m_bl_diag[
i - 1]) +
abs(m_monic[
i]);
226 if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
227 m_bl_diag[
i] *= colB;
228 m_bl_diag[
i - 1] *= rowB;
235 const Index ebl = m_bl_diag.size() - 1;
237 colNorm = headMonic.array().abs().sum();
238 rowNorm =
abs(m_bl_diag[ebl]);
241 if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
243 m_bl_diag[ebl] *= rowB;
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)
Definition: Memory.h:880
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
EIGEN_DEVICE_FUNC Derived & setOnes(Index size)
Definition: CwiseNullaryOp.h:708
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:191
Expression of a fixed-size or dynamic-size sub-vector.
Definition: VectorBlock.h:58
Definition: Companion.h:34
NumTraits< Scalar >::Real RealScalar
Definition: Companion.h:41
companion(const VectorType &poly)
Definition: Companion.h:75
Matrix< Scalar, 1, Deg_1 > LeftBlockFirstRow
Definition: Companion.h:49
Matrix< Scalar, Deg_, Deg_1 > LeftBlock
Definition: Companion.h:47
DenseIndex Index
Definition: Companion.h:51
Matrix< Scalar, Deg, 1 > RightColumn
Definition: Companion.h:42
bool balanced(RealScalar colNorm, RealScalar rowNorm, bool &isBalanced, RealScalar &colB, RealScalar &rowB)
Definition: Companion.h:125
EIGEN_STRONG_INLINE const Scalar_ operator()(Index row, Index col) const
Definition: Companion.h:54
DenseCompanionMatrixType denseMatrix() const
Definition: Companion.h:80
@ Deg_1
Definition: Companion.h:38
@ Deg
Definition: Companion.h:38
Matrix< Scalar, Deg_1, 1 > BottomLeftDiagonal
Definition: Companion.h:44
Matrix< Scalar, Deg, Deg > DenseCompanionMatrixType
Definition: Companion.h:46
bool balancedR(RealScalar colNorm, RealScalar rowNorm, bool &isBalanced, RealScalar &colB, RealScalar &rowB)
Definition: Companion.h:170
void balance()
Definition: Companion.h:193
void setPolynomial(const VectorType &poly)
Definition: Companion.h:68
Matrix< Scalar, Deg_1, Deg_1 > BottomLeftBlock
Definition: Companion.h:48
RightColumn m_monic
Definition: Companion.h:120
BottomLeftDiagonal m_bl_diag
Definition: Companion.h:121
Scalar_ Scalar
Definition: Companion.h:40
RealScalar s
Definition: level1_cplx_impl.h:130
EIGEN_DEVICE_FUNC bool isApprox(const Scalar &x, const Scalar &y, const typename NumTraits< Scalar >::Real &precision=NumTraits< Scalar >::dummy_precision())
Definition: MathFunctions.h:1923
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool() isfinite(const Eigen::bfloat16 &h)
Definition: BFloat16.h:752
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:75
const int Dynamic
Definition: Constants.h:25
bool finished
Definition: MergeRestartFiles.py:79
Definition: Eigen_Colamd.h:49
double Zero
Definition: pseudosolid_node_update_elements.cc:35
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: Companion.h:27
@ ret
Definition: Companion.h:28
Definition: fft_test_shared.h:66