MatrixFunction.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2009-2011, 2013 Jitse Niesen <jitse@maths.leeds.ac.uk>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_MATRIX_FUNCTION_H
11 #define EIGEN_MATRIX_FUNCTION_H
12 
13 #include "StemFunction.h"
14 
15 // IWYU pragma: private
16 #include "./InternalHeaderCheck.h"
17 
18 namespace Eigen {
19 
20 namespace internal {
21 
23 static const float matrix_function_separation = 0.1f;
24 
31 template <typename MatrixType>
33  public:
34  typedef typename MatrixType::Scalar Scalar;
36 
41 
47 
48  private:
50 };
51 
52 template <typename MatrixType>
55  Index rows = A.rows();
56  const MatrixType N = MatrixType::Identity(rows, rows) - A;
57  VectorType e = VectorType::Ones(rows);
58  N.template triangularView<Upper>().solveInPlace(e);
59  return e.cwiseAbs().maxCoeff();
60 }
61 
62 template <typename MatrixType>
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 }
98 
104 template <typename Index, typename ListOfClusters>
105 typename ListOfClusters::iterator matrix_function_find_cluster(Index key, ListOfClusters& clusters) {
106  typename std::list<Index>::iterator j;
107  for (typename ListOfClusters::iterator i = clusters.begin(); i != clusters.end(); ++i) {
108  j = std::find(i->begin(), i->end(), key);
109  if (j != i->end()) return i;
110  }
111  return clusters.end();
112 }
113 
125 template <typename EivalsType, typename Cluster>
126 void matrix_function_partition_eigenvalues(const EivalsType& eivals, std::list<Cluster>& clusters) {
127  typedef typename EivalsType::RealScalar RealScalar;
128  for (Index i = 0; i < eivals.rows(); ++i) {
129  // Find cluster containing i-th ei'val, adding a new cluster if necessary
130  typename std::list<Cluster>::iterator qi = matrix_function_find_cluster(i, clusters);
131  if (qi == clusters.end()) {
132  Cluster l;
133  l.push_back(i);
134  clusters.push_back(l);
135  qi = clusters.end();
136  --qi;
137  }
138 
139  // Look for other element to add to the set
140  for (Index j = i + 1; j < eivals.rows(); ++j) {
142  std::find(qi->begin(), qi->end(), j) == qi->end()) {
143  typename std::list<Cluster>::iterator qj = matrix_function_find_cluster(j, clusters);
144  if (qj == clusters.end()) {
145  qi->push_back(j);
146  } else {
147  qi->insert(qi->end(), qj->begin(), qj->end());
148  clusters.erase(qj);
149  }
150  }
151  }
152  }
153 }
154 
156 template <typename ListOfClusters, typename Index>
157 void matrix_function_compute_cluster_size(const ListOfClusters& clusters, Matrix<Index, Dynamic, 1>& clusterSize) {
158  const Index numClusters = static_cast<Index>(clusters.size());
159  clusterSize.setZero(numClusters);
160  Index clusterIndex = 0;
161  for (typename ListOfClusters::const_iterator cluster = clusters.begin(); cluster != clusters.end(); ++cluster) {
162  clusterSize[clusterIndex] = cluster->size();
163  ++clusterIndex;
164  }
165 }
166 
168 template <typename VectorType>
169 void matrix_function_compute_block_start(const VectorType& clusterSize, VectorType& blockStart) {
170  blockStart.resize(clusterSize.rows());
171  blockStart(0) = 0;
172  for (Index i = 1; i < clusterSize.rows(); i++) {
173  blockStart(i) = blockStart(i - 1) + clusterSize(i - 1);
174  }
175 }
176 
178 template <typename EivalsType, typename ListOfClusters, typename VectorType>
179 void matrix_function_compute_map(const EivalsType& eivals, const ListOfClusters& clusters, VectorType& eivalToCluster) {
180  eivalToCluster.resize(eivals.rows());
181  Index clusterIndex = 0;
182  for (typename ListOfClusters::const_iterator cluster = clusters.begin(); cluster != clusters.end(); ++cluster) {
183  for (Index i = 0; i < eivals.rows(); ++i) {
184  if (std::find(cluster->begin(), cluster->end(), i) != cluster->end()) {
185  eivalToCluster[i] = clusterIndex;
186  }
187  }
188  ++clusterIndex;
189  }
190 }
191 
193 template <typename DynVectorType, typename VectorType>
194 void matrix_function_compute_permutation(const DynVectorType& blockStart, const DynVectorType& eivalToCluster,
195  VectorType& permutation) {
196  DynVectorType indexNextEntry = blockStart;
197  permutation.resize(eivalToCluster.rows());
198  for (Index i = 0; i < eivalToCluster.rows(); i++) {
199  Index cluster = eivalToCluster[i];
200  permutation[i] = indexNextEntry[cluster];
201  ++indexNextEntry[cluster];
202  }
203 }
204 
206 template <typename VectorType, typename MatrixType>
208  for (Index i = 0; i < permutation.rows() - 1; i++) {
209  Index j;
210  for (j = i; j < permutation.rows(); j++) {
211  if (permutation(j) == i) break;
212  }
213  eigen_assert(permutation(j) == i);
214  for (Index k = j - 1; k >= i; k--) {
216  rotation.makeGivens(T(k, k + 1), T(k + 1, k + 1) - T(k, k));
217  T.applyOnTheLeft(k, k + 1, rotation.adjoint());
218  T.applyOnTheRight(k, k + 1, rotation);
219  U.applyOnTheRight(k, k + 1, rotation);
220  std::swap(permutation.coeffRef(k), permutation.coeffRef(k + 1));
221  }
222  }
223 }
224 
231 template <typename MatrixType, typename AtomicType, typename VectorType>
232 void matrix_function_compute_block_atomic(const MatrixType& T, AtomicType& atomic, const VectorType& blockStart,
233  const VectorType& clusterSize, MatrixType& fT) {
234  fT.setZero(T.rows(), T.cols());
235  for (Index i = 0; i < clusterSize.rows(); ++i) {
236  fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)) =
237  atomic.compute(T.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)));
238  }
239 }
240 
263 template <typename MatrixType>
265  eigen_assert(A.rows() == A.cols());
266  eigen_assert(A.isUpperTriangular());
267  eigen_assert(B.rows() == B.cols());
268  eigen_assert(B.isUpperTriangular());
269  eigen_assert(C.rows() == A.rows());
270  eigen_assert(C.cols() == B.rows());
271 
272  typedef typename MatrixType::Scalar Scalar;
273 
274  Index m = A.rows();
275  Index n = B.rows();
276  MatrixType X(m, n);
277 
278  for (Index i = m - 1; i >= 0; --i) {
279  for (Index j = 0; j < n; ++j) {
280  // Compute AX = \sum_{k=i+1}^m A_{ik} X_{kj}
281  Scalar AX;
282  if (i == m - 1) {
283  AX = 0;
284  } else {
285  Matrix<Scalar, 1, 1> AXmatrix = A.row(i).tail(m - 1 - i) * X.col(j).tail(m - 1 - i);
286  AX = AXmatrix(0, 0);
287  }
288 
289  // Compute XB = \sum_{k=1}^{j-1} X_{ik} B_{kj}
290  Scalar XB;
291  if (j == 0) {
292  XB = 0;
293  } else {
294  Matrix<Scalar, 1, 1> XBmatrix = X.row(i).head(j) * B.col(j).head(j);
295  XB = XBmatrix(0, 0);
296  }
297 
298  X(i, j) = (C(i, j) - AX - XB) / (A(i, i) + B(j, j));
299  }
300  }
301  return X;
302 }
303 
310 template <typename MatrixType, typename VectorType>
312  const VectorType& clusterSize, MatrixType& fT) {
313  typedef internal::traits<MatrixType> Traits;
314  typedef typename MatrixType::Scalar Scalar;
315  static const int Options = MatrixType::Options;
317 
318  for (Index k = 1; k < clusterSize.rows(); k++) {
319  for (Index i = 0; i < clusterSize.rows() - k; i++) {
320  // compute (i, i+k) block
321  DynMatrixType A = T.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i));
322  DynMatrixType B = -T.block(blockStart(i + k), blockStart(i + k), clusterSize(i + k), clusterSize(i + k));
323  DynMatrixType C = fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)) *
324  T.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k));
325  C -= T.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k)) *
326  fT.block(blockStart(i + k), blockStart(i + k), clusterSize(i + k), clusterSize(i + k));
327  for (Index m = i + 1; m < i + k; m++) {
328  C += fT.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m)) *
329  T.block(blockStart(m), blockStart(i + k), clusterSize(m), clusterSize(i + k));
330  C -= T.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m)) *
331  fT.block(blockStart(m), blockStart(i + k), clusterSize(m), clusterSize(i + k));
332  }
333  fT.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k)) =
335  }
336  }
337 }
338 
366  template <typename AtomicType, typename ResultType>
367  static void run(const MatrixType& A, AtomicType& atomic, ResultType& result);
368 };
369 
376 template <typename MatrixType>
378  template <typename MatA, typename AtomicType, typename ResultType>
379  static void run(const MatA& A, AtomicType& atomic, ResultType& result) {
380  typedef internal::traits<MatrixType> Traits;
381  typedef typename Traits::Scalar Scalar;
382  static const int Rows = Traits::RowsAtCompileTime, Cols = Traits::ColsAtCompileTime;
383  static const int MaxRows = Traits::MaxRowsAtCompileTime, MaxCols = Traits::MaxColsAtCompileTime;
384 
385  typedef std::complex<Scalar> ComplexScalar;
387 
388  ComplexMatrix CA = A.template cast<ComplexScalar>();
389  ComplexMatrix Cresult;
390  matrix_function_compute<ComplexMatrix>::run(CA, atomic, Cresult);
391  result = Cresult.real();
392  }
393 };
394 
398 template <typename MatrixType>
400  template <typename MatA, typename AtomicType, typename ResultType>
401  static void run(const MatA& A, AtomicType& atomic, ResultType& result) {
402  typedef internal::traits<MatrixType> Traits;
403 
404  // compute Schur decomposition of A
406  eigen_assert(schurOfA.info() == Success);
407  MatrixType T = schurOfA.matrixT();
408  MatrixType U = schurOfA.matrixU();
409 
410  // partition eigenvalues into clusters of ei'vals "close" to each other
411  std::list<std::list<Index> > clusters;
412  matrix_function_partition_eigenvalues(T.diagonal(), clusters);
413 
414  // compute size of each cluster
415  Matrix<Index, Dynamic, 1> clusterSize;
416  matrix_function_compute_cluster_size(clusters, clusterSize);
417 
418  // blockStart[i] is row index at which block corresponding to i-th cluster starts
419  Matrix<Index, Dynamic, 1> blockStart;
420  matrix_function_compute_block_start(clusterSize, blockStart);
421 
422  // compute map so that eivalToCluster[i] = j means that i-th ei'val is in j-th cluster
423  Matrix<Index, Dynamic, 1> eivalToCluster;
424  matrix_function_compute_map(T.diagonal(), clusters, eivalToCluster);
425 
426  // compute permutation which groups ei'vals in same cluster together
428  matrix_function_compute_permutation(blockStart, eivalToCluster, permutation);
429 
430  // permute Schur decomposition
431  matrix_function_permute_schur(permutation, U, T);
432 
433  // compute result
434  MatrixType fT; // matrix function applied to T
435  matrix_function_compute_block_atomic(T, atomic, blockStart, clusterSize, fT);
436  matrix_function_compute_above_diagonal(T, blockStart, clusterSize, fT);
437  result = U * (fT.template triangularView<Upper>() * U.adjoint());
438  }
439 };
440 
441 } // end of namespace internal
442 
453 template <typename Derived>
454 class MatrixFunctionReturnValue : public ReturnByValue<MatrixFunctionReturnValue<Derived> > {
455  public:
456  typedef typename Derived::Scalar Scalar;
458 
459  protected:
461 
462  public:
468  MatrixFunctionReturnValue(const Derived& A, StemFunction f) : m_A(A), m_f(f) {}
469 
474  template <typename ResultType>
475  inline void evalTo(ResultType& result) const {
476  typedef typename internal::nested_eval<Derived, 10>::type NestedEvalType;
477  typedef internal::remove_all_t<NestedEvalType> NestedEvalTypeClean;
479  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
481  DynMatrixType;
482 
484  AtomicType atomic(m_f);
485 
487  }
488 
489  Index rows() const { return m_A.rows(); }
490  Index cols() const { return m_A.cols(); }
491 
492  private:
495 };
496 
497 namespace internal {
498 template <typename Derived>
500  typedef typename Derived::PlainObject ReturnType;
501 };
502 } // namespace internal
503 
504 /********** MatrixBase methods **********/
505 
506 template <typename Derived>
509  eigen_assert(rows() == cols());
510  return MatrixFunctionReturnValue<Derived>(derived(), f);
511 }
512 
513 template <typename Derived>
515  eigen_assert(rows() == cols());
516  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
517  return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_sin<ComplexScalar>);
518 }
519 
520 template <typename Derived>
521 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const {
522  eigen_assert(rows() == cols());
523  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
524  return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_cos<ComplexScalar>);
525 }
526 
527 template <typename Derived>
528 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const {
529  eigen_assert(rows() == cols());
530  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
531  return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_sinh<ComplexScalar>);
532 }
533 
534 template <typename Derived>
535 const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const {
536  eigen_assert(rows() == cols());
537  typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
538  return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_cosh<ComplexScalar>);
539 }
540 
541 } // end namespace Eigen
542 
543 #endif // EIGEN_MATRIX_FUNCTION_H
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
cout<< "Here is a random 4x4 matrix, A:"<< endl<< A<< endl<< endl;ComplexSchur< MatrixXcf > schurOfA(A, false)
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
VectorXcd eivals
Definition: MatrixBase_eigenvalues.cpp:2
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
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
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:49
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:48
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 100 >, boost::multiprecision::et_on > Real
Definition: boostmultiprec.cpp:77
Rotation given by a cosine-sine pair.
Definition: Jacobi.h:38
EIGEN_DEVICE_FUNC void makeGivens(const Scalar &p, const Scalar &q, Scalar *r=0)
Definition: Jacobi.h:152
EIGEN_DEVICE_FUNC JacobiRotation adjoint() const
Definition: Jacobi.h:67
const MatrixFunctionReturnValue< Derived > matrixFunction(StemFunction f) const
Helper function for the unsupported MatrixFunctions module.
Definition: MatrixFunction.h:507
Proxy for the matrix function of some matrix (expression).
Definition: MatrixFunction.h:454
internal::ref_selector< Derived >::type DerivedNested
Definition: MatrixFunction.h:460
Index rows() const
Definition: MatrixFunction.h:489
internal::stem_function< Scalar >::type StemFunction
Definition: MatrixFunction.h:457
void evalTo(ResultType &result) const
Compute the matrix function.
Definition: MatrixFunction.h:475
StemFunction * m_f
Definition: MatrixFunction.h:494
Index cols() const
Definition: MatrixFunction.h:490
Derived::Scalar Scalar
Definition: MatrixFunction.h:456
MatrixFunctionReturnValue(const Derived &A, StemFunction f)
Constructor.
Definition: MatrixFunction.h:468
const DerivedNested m_A
Definition: MatrixFunction.h:493
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:192
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Definition: CwiseNullaryOp.h:569
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:191
Definition: ReturnByValue.h:50
Helper class for computing matrix functions of atomic matrices.
Definition: MatrixFunction.h:32
MatrixFunctionAtomic(StemFunction f)
Constructor.
Definition: MatrixFunction.h:40
MatrixType::Scalar Scalar
Definition: MatrixFunction.h:34
MatrixType compute(const MatrixType &A)
Compute matrix function of atomic matrix.
Definition: MatrixFunction.h:63
StemFunction * m_f
Definition: MatrixFunction.h:49
stem_function< Scalar >::type StemFunction
Definition: MatrixFunction.h:35
Definition: matrices.h:74
@ IsComplex
Definition: common.h:73
@ N
Definition: constructor.cpp:22
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
#define max(a, b)
Definition: datatypes.h:23
@ Success
Definition: Constants.h:440
#define X
Definition: icosphere.cpp:20
RealScalar s
Definition: level1_cplx_impl.h:130
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 cosh(const bfloat16 &a)
Definition: BFloat16.h:638
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sinh(const bfloat16 &a)
Definition: BFloat16.h:637
void matrix_function_compute_permutation(const DynVectorType &blockStart, const DynVectorType &eivalToCluster, VectorType &permutation)
Compute permutation which groups ei'vals in same cluster together.
Definition: MatrixFunction.h:194
void matrix_function_compute_cluster_size(const ListOfClusters &clusters, Matrix< Index, Dynamic, 1 > &clusterSize)
Compute size of each cluster given a partitioning.
Definition: MatrixFunction.h:157
void matrix_function_compute_block_start(const VectorType &clusterSize, VectorType &blockStart)
Compute start of each block using clusterSize.
Definition: MatrixFunction.h:169
void matrix_function_compute_block_atomic(const MatrixType &T, AtomicType &atomic, const VectorType &blockStart, const VectorType &clusterSize, MatrixType &fT)
Compute block diagonal part of matrix function.
Definition: MatrixFunction.h:232
void matrix_function_permute_schur(VectorType &permutation, MatrixType &U, MatrixType &T)
Permute Schur decomposition in U and T according to permutation.
Definition: MatrixFunction.h:207
static const float matrix_function_separation
Maximum distance allowed between eigenvalues to be considered "close".
Definition: MatrixFunction.h:23
void matrix_function_compute_above_diagonal(const MatrixType &T, const VectorType &blockStart, const VectorType &clusterSize, MatrixType &fT)
Compute part of matrix function above block diagonal.
Definition: MatrixFunction.h:311
void matrix_function_partition_eigenvalues(const EivalsType &eivals, std::list< Cluster > &clusters)
Partition eigenvalues in clusters of ei'vals close to each other.
Definition: MatrixFunction.h:126
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
NumTraits< typename MatrixType::Scalar >::Real matrix_function_compute_mu(const MatrixType &A)
Definition: MatrixFunction.h:53
MatrixType matrix_function_solve_triangular_sylvester(const MatrixType &A, const MatrixType &B, const MatrixType &C)
Solve a triangular Sylvester equation AX + XB = C.
Definition: MatrixFunction.h:264
void matrix_function_compute_map(const EivalsType &eivals, const ListOfClusters &clusters, VectorType &eivalToCluster)
Compute mapping of eigenvalue indices to cluster indices.
Definition: MatrixFunction.h:179
ListOfClusters::iterator matrix_function_find_cluster(Index key, ListOfClusters &clusters)
Find cluster in clusters containing some value.
Definition: MatrixFunction.h:105
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
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
double U
Swimming speed.
Definition: two_d_variable_diff_adapt.cc:53
r
Definition: UniformPSDSelfTest.py:20
type
Definition: compute_granudrum_aor.py:141
Definition: Eigen_Colamd.h:49
@ F
Definition: octree.h:74
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
static void run(const MatA &A, AtomicType &atomic, ResultType &result)
Definition: MatrixFunction.h:379
static void run(const MatA &A, AtomicType &atomic, ResultType &result)
Definition: MatrixFunction.h:401
Class for computing matrix functions.
Definition: MatrixFunction.h:355
static void run(const MatrixType &A, AtomicType &atomic, ResultType &result)
Compute the matrix function.
std::conditional_t< Evaluate, PlainObject, typename ref_selector< T >::type > type
Definition: XprHelper.h:549
std::conditional_t< is_same< typename traits< ExpressionType >::XprKind, MatrixXpr >::value, MatrixColType, ArrayColType > type
Definition: XprHelper.h:782
std::conditional_t< bool(traits< T >::Flags &NestByRefBit), T const &, const T > type
Definition: XprHelper.h:507
Definition: ForwardDeclarations.h:499
std::complex< typename NumTraits< Scalar >::Real > ComplexScalar
Definition: ForwardDeclarations.h:500
Derived::PlainObject ReturnType
Definition: MatrixFunction.h:500
Definition: fft_test_shared.h:66
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2