Eigen::internal::MatrixFunctionAtomic< MatrixType > Class Template Reference

Helper class for computing matrix functions of atomic matrices. More...

#include <MatrixFunction.h>

Public Types

typedef MatrixType::Scalar Scalar
 
typedef stem_function< Scalar >::type StemFunction
 

Public Member Functions

 MatrixFunctionAtomic (StemFunction f)
 Constructor. More...
 
MatrixType compute (const MatrixType &A)
 Compute matrix function of atomic matrix. More...
 

Private Attributes

StemFunctionm_f
 

Detailed Description

template<typename MatrixType>
class Eigen::internal::MatrixFunctionAtomic< MatrixType >

Helper class for computing matrix functions of atomic matrices.

Here, an atomic matrix is a triangular matrix whose diagonal entries are close to each other.

Member Typedef Documentation

◆ Scalar

template<typename MatrixType >
typedef MatrixType::Scalar Eigen::internal::MatrixFunctionAtomic< MatrixType >::Scalar

◆ StemFunction

template<typename MatrixType >
typedef stem_function<Scalar>::type Eigen::internal::MatrixFunctionAtomic< MatrixType >::StemFunction

Constructor & Destructor Documentation

◆ MatrixFunctionAtomic()

template<typename MatrixType >
Eigen::internal::MatrixFunctionAtomic< MatrixType >::MatrixFunctionAtomic ( StemFunction  f)
inline

Constructor.

Parameters
[in]fmatrix function to compute.
40 : m_f(f) {}
StemFunction * m_f
Definition: MatrixFunction.h:49
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237

Member Function Documentation

◆ compute()

template<typename MatrixType >
MatrixType Eigen::internal::MatrixFunctionAtomic< MatrixType >::compute ( const MatrixType A)

Compute matrix function of atomic matrix.

Parameters
[in]Aargument of matrix function, should be upper triangular and atomic
Returns
f(A), the matrix function evaluated at the given matrix
63  {
64  // TODO: Use that A is upper triangular
65  typedef typename NumTraits<Scalar>::Real RealScalar;
66  Index rows = A.rows();
67  Scalar avgEival = A.trace() / Scalar(RealScalar(rows));
68  MatrixType Ashifted = A - avgEival * MatrixType::Identity(rows, rows);
70  MatrixType F = m_f(avgEival, 0) * MatrixType::Identity(rows, rows);
71  MatrixType P = Ashifted;
72  MatrixType Fincr;
73  for (Index s = 1; double(s) < 1.1 * double(rows) + 10.0; s++) { // upper limit is fairly arbitrary
74  Fincr = m_f(avgEival, static_cast<int>(s)) * P;
75  F += Fincr;
76  P = Scalar(RealScalar(1) / RealScalar(s + 1)) * P * Ashifted;
77 
78  // test whether Taylor series converged
79  const RealScalar F_norm = F.cwiseAbs().rowwise().sum().maxCoeff();
80  const RealScalar Fincr_norm = Fincr.cwiseAbs().rowwise().sum().maxCoeff();
81  if (Fincr_norm < NumTraits<Scalar>::epsilon() * F_norm) {
82  RealScalar delta = 0;
83  RealScalar rfactorial = 1;
84  for (Index r = 0; r < rows; r++) {
85  RealScalar mx = 0;
86  for (Index i = 0; i < rows; i++)
87  mx = (std::max)(mx, std::abs(m_f(Ashifted(i, i) + avgEival, static_cast<int>(s + r))));
88  if (r != 0) rfactorial *= RealScalar(r);
89  delta = (std::max)(delta, mx / rfactorial);
90  }
91  const RealScalar P_norm = P.cwiseAbs().rowwise().sum().maxCoeff();
92  if (mu * delta * P_norm < NumTraits<Scalar>::epsilon() * F_norm) // series converged
93  break;
94  }
95  }
96  return F;
97 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
int i
Definition: BiCGSTAB_step_by_step.cpp:9
int rows
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
MatrixType::Scalar Scalar
Definition: MatrixFunction.h:34
#define max(a, b)
Definition: datatypes.h:23
RealScalar s
Definition: level1_cplx_impl.h:130
NumTraits< typename MatrixType::Scalar >::Real matrix_function_compute_mu(const MatrixType &A)
Definition: MatrixFunction.h:53
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
std::complex< double > mu
Definition: time_harmonic_fourier_decomposed_linear_elasticity/cylinder/cylinder.cc:52
double P
Uniform pressure.
Definition: TwenteMeshGluing.cpp:77
int delta
Definition: MultiOpt.py:96
r
Definition: UniformPSDSelfTest.py:20
@ F
Definition: octree.h:74
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
T Real
Definition: NumTraits.h:183

References abs(), MultiOpt::delta, oomph::OcTreeNames::F, i, Eigen::internal::matrix_function_compute_mu(), max, Global_Parameters::mu, Global_Physical_Variables::P, UniformPSDSelfTest::r, rows, Eigen::PlainObjectBase< Derived >::rows(), and s.

Member Data Documentation

◆ m_f

template<typename MatrixType >
StemFunction* Eigen::internal::MatrixFunctionAtomic< MatrixType >::m_f
private

The documentation for this class was generated from the following file: