| namespace Eigen { | |
| /** \page StructuredMatricesExamples StructuredMatrices examples | |
| These programs solve problems from numerical PDEs, integral equations, signal and image processing, approximation | |
| theory, statistics, control and quantum mechanics with the \ref StructuredMatrices_Module. Each one replaces a dense | |
| or sparse factorization by an algorithm that exploits a structure of the problem -- a Kronecker product or sum, | |
| Toeplitz, Hankel or circulant, Vandermonde, Cauchy, or diagonal plus low rank -- and checks its result against a known | |
| solution or a general-purpose solver. The bracketed numbers cite the module's | |
| \ref StructuredMatricesReferences "references". | |
| \tableofcontents | |
| \section StructuredExamplesGrids Separable operators on tensor-product grids | |
| Finite differences on a tensor-product grid give Kronecker sums of 1-D matrices: with grid values stored with x as the | |
| fast index, the 2-D Laplacian is \f$ D_y \oplus D_x = D_y \otimes I + I \otimes D_x \f$. \ref KroneckerSum applies | |
| such operators without forming them, and \ref BartelsStewart solves them through the Schur forms or | |
| eigendecompositions of the 1-D factors. LeVeque [1] covers the discretizations. | |
| \subsection StructuredExamplePoisson2D The 2-D Poisson equation | |
| The fast Poisson solver: two \f$ n \times n \f$ eigendecompositions instead of a factorization of the | |
| \f$ n^2 \times n^2 \f$ matrix, with the second-order convergence of the discretization: the fast diagonalization | |
| method of Lynch, Rice and Thomas [2]. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredPoisson2D.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredPoisson2D.out | |
| </td></tr></table> | |
| \subsection StructuredExampleHeat3D Implicit time stepping of the 3-D heat equation | |
| The decompositions are computed once and reused at every step. A shift such as the identity of | |
| \f$ I + \tau L \f$ goes into one factor, since \f$ I \otimes I \otimes I = I \f$. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredHeat3D.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredHeat3D.out | |
| </td></tr></table> | |
| \subsection StructuredExampleConvectionDiffusion Convection-diffusion | |
| Nonsymmetric 1-D operators take the Schur-form path of \ref BartelsStewart, the algorithm of Bartels and Stewart [3]; | |
| the solution agrees with \c SparseLU on the assembled matrix. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredConvectionDiffusion.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredConvectionDiffusion.out | |
| </td></tr></table> | |
| \subsection StructuredExampleADI Alternating-direction implicit time stepping | |
| The Peaceman-Rachford ADI method [4] treats one direction at a time. Each half step is a \ref KroneckerOperator with an | |
| \c Identity() factor, which costs nothing: the product is a sparse product with the 1-D matrix and the solve one | |
| \c SparseLU of a tridiagonal matrix. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredADI.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredADI.out | |
| </td></tr></table> | |
| \subsection StructuredExamplePreconditioner A non-separable potential | |
| When a term breaks the separable structure, the separable part still helps twice: \ref KroneckerSparseView | |
| assembles the sparse matrix in one expression, and the fast Poisson solver preconditions conjugate gradients. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredPreconditioner.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredPreconditioner.out | |
| </td></tr></table> | |
| \subsection StructuredExampleTorusHelmholtz Periodic boundaries: the screened Poisson equation on a torus | |
| With periodic boundaries the five-point stencil is a block circulant with circulant blocks, solved by \ref Bccb | |
| through the 2-D FFT [5]. It is also the Kronecker sum of two 1-D periodic second-difference circulants, and the two | |
| solvers agree. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredTorusHelmholtz.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredTorusHelmholtz.out | |
| </td></tr></table> | |
| \subsection StructuredExampleSpectralDifferentiation Fourier spectral differentiation | |
| On a periodic grid the spectral differentiation matrices are circulants [21], and their spectra are the wavenumbers: | |
| \ref Circulant::eigenvalues returns \f$ ik \f$, \ref Circulant::rank counts the \f$ N - 2 \f$ nonzero ones (the | |
| constant and the sawtooth mode are annihilated), and the pseudo-inverse \ref Circulant::solve integrates a periodic | |
| function with zero mean. Derivatives and the periodic boundary value problem \f$ u'' - u = f \f$ converge | |
| geometrically for smooth \f$ u \f$. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredSpectralDifferentiation.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredSpectralDifferentiation.out | |
| </td></tr></table> | |
| \section StructuredExamplesSpectra Matrix equations and spectra | |
| \subsection StructuredExampleLyapunov The Lyapunov equation of a mass-spring chain | |
| \f$ A X + X A^T = C \f$ is \f$ (A \oplus A)\,\mathrm{vec}(X) = \mathrm{vec}(C) \f$, and the Sylvester equation | |
| \f$ A X + X B = C \f$ is \f$ (B^T \oplus A)\,\mathrm{vec}(X) = \mathrm{vec}(C) \f$. This example computes the | |
| controllability Gramian of a damped chain, whose system matrix has complex eigenvalue pairs; Simoncini [6] surveys the | |
| methods for such matrix equations. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredLyapunov.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredLyapunov.out | |
| </td></tr></table> | |
| \subsection StructuredExampleHarmonicOscillator The 2-D quantum harmonic oscillator | |
| A separable Hamiltonian \f$ H_x \oplus H_y \f$ has the pairwise sums of the 1-D energies as its spectrum, which | |
| \ref KroneckerSum::eigenvalues returns without forming the 2-D matrix [7]. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredHarmonicOscillator.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredHarmonicOscillator.out | |
| </td></tr></table> | |
| \subsection StructuredExampleImpurity An impurity bound state | |
| A localized perturbation of a diagonal band Hamiltonian is a rank-one update, the Koster-Slater model [8]. \ref DPR1EigenSolver finds the whole | |
| spectrum in \f$ O(N^2) \f$ from the secular equation [9], including the bound state that splits off below the band. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredImpurity.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredImpurity.out | |
| </td></tr></table> | |
| \subsection StructuredExampleDivideAndConquer The merge step of divide and conquer | |
| Cuppen's method [25] tears a symmetric tridiagonal matrix into two halves plus a rank-one coupling; after the halves | |
| are diagonalized, what remains is the diagonal-plus-rank-one eigenproblem that \ref DPR1EigenSolver solves from the | |
| secular equation, with eigenvectors orthogonal to working accuracy by the construction of Gu and Eisenstat [9]. The | |
| example performs one such merge and compares with \c SelfAdjointEigenSolver. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredDivideAndConquer.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredDivideAndConquer.out | |
| </td></tr></table> | |
| \section StructuredExamplesToeplitz Toeplitz, circulant and Hankel systems | |
| \subsection StructuredExampleLoveEquation Love's integral equation and a preconditioned Toeplitz system | |
| A translation-invariant kernel discretized on a uniform grid gives a \ref Toeplitz matrix. Love's equation [10] is solved | |
| directly by \ref LookAheadLevinson [11] in \f$ O(n^2) \f$. For large systems, conjugate gradients use the FFT-based | |
| Toeplitz product and Strang's \ref Circulant preconditioner [12], [13], \f$ O(n \log n) \f$ per iteration. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredLoveEquation.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredLoveEquation.out | |
| </td></tr></table> | |
| \subsection StructuredExamplePade Pade approximation | |
| The denominator of a Pade approximant [14] solves a \ref Hankel system in the Taylor coefficients, solved in | |
| \f$ O(n^2) \f$ through its Toeplitz equivalent. Rescaling the variable equilibrates the coefficients and keeps the | |
| system Hankel. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredPade.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredPade.out | |
| </td></tr></table> | |
| \section StructuredExamplesSignals Signal and image processing | |
| \subsection StructuredExampleDeconvolution Deconvolution by Toeplitz least squares | |
| The full convolution of a signal with a kernel is a rectangular \ref Toeplitz matrix. \c LSMR [22] solves the | |
| least-squares problem without forming it: products with the matrix and, through \ref Toeplitz::adjoint, its transpose | |
| cost \f$ O(p \log p) \f$ each by circulant embedding [13]. The matrix-free solution agrees with the dense QR of the | |
| materialized matrix. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredDeconvolution.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredDeconvolution.out | |
| </td></tr></table> | |
| \subsection StructuredExampleDeblurring Image deblurring with periodic boundaries | |
| A blur with periodic boundary conditions is a \ref Bccb matrix [5]. A motion blur annihilates whole frequency lines, | |
| which \ref Bccb::rank counts exactly, so the pseudo-inverse \ref Bccb::solve cannot undo it and amplifies the noise | |
| next to those lines. Tikhonov regularization stays within the class: \f$ A^H A + \lambda I \f$ is the Bccb generated by | |
| the autocorrelation of the point spread function, computed with two products, and each \f$ \lambda \f$ costs one | |
| \f$ O(N \log N) \f$ solve. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredDeblurring.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredDeblurring.out | |
| </td></tr></table> | |
| \subsection StructuredExampleProny Prony's method | |
| A sum of exponentials obeys a linear recurrence whose coefficients solve a \ref Hankel system in the samples [23]; the | |
| roots of its characteristic polynomial are the damping rates and frequencies, and the amplitudes solve the dual | |
| \ref Vandermonde system with complex nodes, which \ref BjorckPereyra handles in Leja order. The recurrence residual | |
| over all samples is a rectangular Hankel product. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredProny.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredProny.out | |
| </td></tr></table> | |
| \section StructuredExamplesApproximation Interpolation and approximation | |
| \subsection StructuredExampleQuadrature Interpolatory quadrature | |
| The weights of an interpolatory quadrature rule solve the transposed \ref Vandermonde system, the dual problem that | |
| \ref BjorckPereyra [16] solves in \f$ O(n^2) \f$; on Chebyshev extreme points they are the Clenshaw-Curtis weights | |
| [15]. The primal solve gives interpolation coefficients. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredQuadrature.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredQuadrature.out | |
| </td></tr></table> | |
| \subsection StructuredExampleRationalApproximation A discretized Cauchy integral | |
| Representing an analytic function by point charges outside its domain leads to a \ref Cauchy system, factored with | |
| pivoting in \f$ O(n^2) \f$ by \ref CauchyLU [18]; the error decays geometrically, as for the trapezoidal rule on a | |
| circle [17]. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredRationalApproximation.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredRationalApproximation.out | |
| </td></tr></table> | |
| \subsection StructuredExamplePolynomialFit Polynomial least squares and the Hilbert matrix | |
| The normal equations of continuous least-squares approximation in the monomial basis have the Hilbert matrix, a | |
| \ref Cauchy matrix [26]: \ref CauchyLU solves them in \f$ O(n^2) \f$ and \ref Cauchy::determinant gives | |
| \f$ \det H_n \f$ in closed form where dense LU loses digits. The fitted polynomial is far less sensitive to | |
| \f$ \kappa(H_n) \f$ than its coefficients, and matches the discrete fit by a dense QR of the rectangular | |
| \ref Vandermonde matrix; Vandermonde products evaluate both. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredPolynomialFit.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredPolynomialFit.out | |
| </td></tr></table> | |
| \subsection StructuredExampleSeparableLeastSquares Separable least squares on a grid | |
| The design matrix of a tensor-product polynomial fit on a grid is the Kronecker product of two rectangular Vandermonde | |
| matrices. \ref KroneckerOperator::leastSquaresSolve applies \f$ (A \otimes B)^+ = A^+ \otimes B^+ \f$ [27] with one | |
| complete orthogonal decomposition per factor, and \ref KroneckerOperator::rank and | |
| \ref KroneckerOperator::singularValues come from the factors too; the dense decomposition of the assembled matrix | |
| agrees. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredSeparableLeastSquares.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredSeparableLeastSquares.out | |
| </td></tr></table> | |
| \section StructuredExamplesStatistics Statistics and estimation | |
| \subsection StructuredExampleGaussianProcess A Gaussian-process likelihood | |
| A covariance that is noise plus a low-rank feature model [19], [20] is a \ref DiagonalPlusLowRank operator. Its solve | |
| (Woodbury identity) and determinant (matrix determinant lemma) cost \f$ O(n k^2) \f$, the price of evaluating the | |
| log-likelihood. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredGaussianProcess.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredGaussianProcess.out | |
| </td></tr></table> | |
| \subsection StructuredExampleKalmanUpdate A Kalman measurement update | |
| With a diagonal prior and \f$ k \f$ measurements, the posterior precision is diagonal plus rank \f$ k \f$, and | |
| \ref DiagonalPlusLowRank::inverse returns the posterior covariance as another \ref DiagonalPlusLowRank, since the | |
| Woodbury identity is the Kalman update [24]. The posterior mean is one \f$ O(nk) \f$ product and the posterior variances are | |
| read off the diagonal; the dense \f$ n \times n \f$ computation agrees. | |
| <table class="example"> | |
| <tr><th>Example:</th><th>Output:</th></tr> | |
| <tr><td> | |
| \include StructuredKalmanUpdate.cpp | |
| </td> | |
| <td> | |
| \verbinclude StructuredKalmanUpdate.out | |
| </td></tr></table> | |
| */ | |
| } // namespace Eigen |