#
# = Eigensystems
# === {}[link:index.html"name="0.1] Contentes
# 1. {Modules and classes}[link:files/rdoc/eigen_rdoc.html#1]
# 1. {Real Symmetric Matrices}[link:files/rdoc/eigen_rdoc.html#2]
# 1. {Complex Hermitian Matrices}[link:files/rdoc/eigen_rdoc.html#3]
# 1. {Real Nonsymmetric Matrices}[link:files/rdoc/eigen_rdoc.html#4] (>= GSL-1.9)
# 1. {Real Generalized Symmetric-Definite Eigensystems}[link:files/rdoc/eigen_rdoc.html#5] (>= GSL-1.10)
# 1. {Complex Generalized Hermitian-Definite Eigensystems}[link:files/rdoc/eigen_rdoc.html#6] (>= GSL-1.10)
# 1. {Real Generalized Nonsymmetric Eigensystems}[link:files/rdoc/eigen_rdoc.html#7] (>= GSL-1.10)
# 1. {Sorting Eigenvalues and Eigenvectors }[link:files/rdoc/eigen_rdoc.html#8]
#
# == {}[link:index.html"name="1] Modules and classes
#
# * GSL
# * Eigen
# * EigenValues < Vector
# * EigenVectors < Matrix
# * Symm (Module)
# * Workspace (Class)
# * Symmv (Module)
# * Workspace (Class)
# * Nonsymm (Module, >= GSL-1.9)
# * Workspace (Class)
# * Nonsymmv (Module, >= GSL-1.9)
# * Workspace (Class)
# * Gensymm (Module, >= GSL-1.10)
# * Workspace (Class)
# * Gensymmv (Module, >= GSL-1.10)
# * Workspace (Class)
# * Herm (Module)
# * Workspace (Class)
# * Hermv (Module)
# * Workspace (Class)
# * Vectors < Matrix::Complex
# * Genherm (Module, >= GSL-1.10)
# * Workspace (Class)
# * Genhermv (Module, >= GSL-1.10)
# * Workspace (Class)
# * Gen (Module, >= GSL-1.10)
# * Workspace (Class)
# * Genv (Module, >= GSL-1.10)
# * Workspace (Class)
#
# == {}[link:index.html"name="2] Real Symmetric Matrices, GSL::Eigen::Symm module
# === {}[link:index.html"name="2.1] Workspace classes
# ---
# * GSL::Eigen::Symm::Workspace.alloc(n)
# * GSL::Eigen::Symmv::Workspace.alloc(n)
# * GSL::Eigen::Herm::Workspace.alloc(n)
# * GSL::Eigen::Hermv::Workspace.alloc(n)
#
#
# === {}[link:index.html"name="2.2] Methods to solve eigensystems
# ---
# * GSL::Eigen::symm(A)
# * GSL::Eigen::symm(A, workspace)
# * GSL::Matrix#eigen_symm
# * GSL::Matrix#eigen_symm(workspace)
#
# These methods compute the eigenvalues of the real symmetric matrix.
# The workspace object workspace can be omitted.
#
# ---
# * GSL::Eigen::symmv(A)
# * GSL::Matrix#eigen_symmv
#
# These methods compute the eigenvalues and eigenvectors of the real symmetric
# matrix, and return an array of two elements:
# The first is a GSL::Vector object which stores all the eigenvalues.
# The second is a GSL::Matrix object, whose columns contain
# eigenvectors.
#
# 1. Singleton method of the GSL::Eigen module, GSL::Eigen::symm
#
# m = GSL::Matrix.alloc([1.0, 1/2.0, 1/3.0, 1/4.0], [1/2.0, 1/3.0, 1/4.0, 1/5.0],
# [1/3.0, 1/4.0, 1/5.0, 1/6.0], [1/4.0, 1/5.0, 1/6.0, 1/7.0])
# eigval, eigvec = Eigen::symmv(m)
#
# 1. Instance method of GSL::Matrix class
#
# eigval, eigvec = m.eigen_symmv
#
# == {}[link:index.html"name="3] Complex Hermitian Matrices
# ---
# * GSL::Eigen::herm(A)
# * GSL::Eigen::herm(A, workspace)
# * GSL::Matrix::Complex#eigen_herm
# * GSL::Matrix::Complex#eigen_herm(workspace)
#
# These methods compute the eigenvalues of the complex hermitian matrix.
#
# ---
# * GSL::Eigen::hermv(A)
# * GSL::Eigen::hermv(A, workspace)
# * GSL::Matrix::Complex#eigen_hermv
# * GSL::Matrix::Complex#eigen_hermv(workspace
#
#
# == {}[link:index.html"name="4] Real Nonsymmetric Matrices (>= GSL-1.9)
#
# ---
# * GSL::Eigen::Nonsymm.alloc(n)
#
# This allocates a workspace for computing eigenvalues of n-by-n real
# nonsymmetric matrices. The size of the workspace is O(2n).
#
# ---
# * GSL::Eigen::Nonsymm::params(compute_t, balance, wspace)
# * GSL::Eigen::Nonsymm::Workspace#params(compute_t, balance)
#
# This method sets some parameters which determine how the eigenvalue
# problem is solved in subsequent calls to GSL::Eigen::nonsymm.
# If compute_t is set to 1, the full Schur form T will be
# computed by gsl_eigen_nonsymm. If it is set to 0, T will not be
# computed (this is the default setting).
# Computing the full Schur form T requires approximately 1.5-2 times
# the number of flops.
#
# If balance is set to 1, a balancing transformation is applied to
# the matrix prior to computing eigenvalues. This transformation is designed
# to make the rows and columns of the matrix have comparable norms, and can
# result in more accurate eigenvalues for matrices whose entries vary widely
# in magnitude. See section Balancing for more information. Note that the
# balancing transformation does not preserve the orthogonality of the Schur
# vectors, so if you wish to compute the Schur vectors with
# GSL::Eigen::nonsymm_Z you will obtain the Schur vectors of the
# balanced matrix instead of the original matrix. The relationship will be
# where Q is the matrix of Schur vectors for the balanced matrix, and D
# is the balancing transformation. Then GSL::Eigen::nonsymm_Z will
# compute a matrix Z which satisfies with Z = D Q.
# Note that Z will not be orthogonal. For this reason, balancing is
# not performed by default.
#
# ---
# * GSL::Eigen::nonsymm(m, eval, wspace)
# * GSL::Eigen::nonsymm(m)
# * GSL::Matrix#eigen_nonsymm()
# * GSL::Matrix#eigen_nonsymm(wspace)
# * GSL::Matrix#eigen_nonsymm(eval, wspace)
#
# These methods compute the eigenvalues of the real nonsymmetric matrix m
# and return them, or store in the vector eval if it given.
# If T is desired, it is stored in m on output, however the lower
# triangular portion will not be zeroed out. Otherwise, on output, the diagonal
# of m will contain the 1-by-1 real eigenvalues and 2-by-2 complex
# conjugate eigenvalue systems, and the rest of m is destroyed.
#
# ---
# * GSL::Eigen::nonsymm_Z(m, eval, Z, wspace)
# * GSL::Eigen::nonsymm_Z(m)
# * GSL::Matrix#eigen_nonsymm_Z()
# * GSL::Matrix#eigen_nonsymm(eval, Z, wspace)
#
# These methods are identical to GSL::Eigen::nonsymm except they also
# compute the Schur vectors and return them (or store into Z).
#
# ---
# * GSL::Eigen::Nonsymmv.alloc(n)
#
# Allocates a workspace for computing eigenvalues and eigenvectors
# of n-by-n real nonsymmetric matrices. The size of the workspace is O(5n).
# ---
# * GSL::Eigen::nonsymm(m)
# * GSL::Eigen::nonsymm(m, wspace)
# * GSL::Eigen::nonsymm(m, eval, evec)
# * GSL::Eigen::nonsymm(m, eval, evec, wspace)
# * GSL::Matrix#eigen_nonsymmv()
# * GSL::Matrix#eigen_nonsymmv(wspace)
# * GSL::Matrix#eigen_nonsymmv(eval, evec)
# * GSL::Matrix#eigen_nonsymmv(eval, evec, wspace)
#
# Compute eigenvalues and right eigenvectors of the n-by-n real nonsymmetric
# matrix. The computed eigenvectors are normalized to have Euclidean norm 1.
# On output, the upper portion of m contains the Schur form T.
#
# == {}[link:index.html"name="5] Real Generalized Symmetric-Definite Eigensystems (GSL-1.10)
# The real generalized symmetric-definite eigenvalue problem is to
# find eigenvalues lambda and eigenvectors x such that
# where A and B are symmetric matrices, and B
# is positive-definite. This problem reduces to the standard symmetric eigenvalue
# problem by applying the Cholesky decomposition to B:
# Therefore, the problem becomes C y = lambda y
# where C = L^{-1} A L^{-t} is symmetric, and y = L^t x.
# The standard symmetric eigensolver can be applied to the matrix C.
# The resulting eigenvectors are backtransformed to find the vectors of the
# original problem. The eigenvalues and eigenvectors of the generalized
# symmetric-definite eigenproblem are always real.
#
# ---
# * GSL::Eigen::Gensymm.alloc(n)
# * GSL::Eigen::Gensymm::Workspace.alloc(n)
#
# Allocates a workspace for computing eigenvalues of n-by-n real
# generalized symmetric-definite eigensystems.
# The size of the workspace is O(2n).
# ---
# * GSL::Eigen::gensymm(A, B, w)
#
# Computes the eigenvalues of the real generalized symmetric-definite matrix
# pair A, B, and returns them as a GSL::Vector,
# using the method outlined above. On output, B contains its Cholesky
# decomposition.
# ---
# * GSL::Eigen::gensymmv(A, B, w)
#
# Computes the eigenvalues and eigenvectors of the real generalized
# symmetric-definite matrix pair A, B, and returns
# them as a GSL::Vector and a GSL::Matrix.
# The computed eigenvectors are normalized to have unit magnitude.
# On output, B contains its Cholesky decomposition.
#
# == {}[link:index.html"name="6] Complex Generalized Hermitian-Definite Eigensystems (>= GSL-1.10)
# The complex generalized hermitian-definite eigenvalue problem is to
# find eigenvalues lambda and eigenvectors x such that
# where A and B are hermitian matrices, and B
# is positive-definite. Similarly to the real case, this can be reduced to
# C y = lambda y where C = L^{-1} A L^{-H} is hermitian,
# and y = L^H x. The standard hermitian eigensolver can be applied to
# the matrix C. The resulting eigenvectors are backtransformed
# to find the vectors of the original problem.
# The eigenvalues of the generalized hermitian-definite eigenproblem are always
# real.
#
# ---
# * GSL::Eigen::Genherm.alloc(n)
#
# Allocates a workspace for computing eigenvalues of n-by-n complex
# generalized hermitian-definite eigensystems.
# The size of the workspace is O(3n).
# ---
# * GSL::Eigen::genherm(A, B, w)
#
# Computes the eigenvalues of the complex generalized hermitian-definite
# matrix pair A, B, and returns them as a GSL::Vector,
# using the method outlined above.
# On output, B contains its Cholesky decomposition.
# ---
# * GSL::Eigen::genherm(A, B, w)
#
# Computes the eigenvalues and eigenvectors of the complex generalized
# hermitian-definite matrix pair A, B,
# and returns them as a GSL::Vector and a GSL::Matrix::Complex.
# The computed eigenvectors are normalized to have unit magnitude.
# On output, B contains its Cholesky decomposition.
#
# == {}[link:index.html"name="7] Real Generalized Nonsymmetric Eigensystems (>= GSL-1.10)
#
# ---
# * GSL::Eigen::Gen.alloc(n)
# * GSL::Eigen::Gen::Workspace.alloc(n)
#
# Allocates a workspace for computing eigenvalues of n-by-n real generalized
# nonsymmetric eigensystems. The size of the workspace is O(n).
#
# ---
# * GSL::Eigen::Gen::params(compute_s, compute_t, balance, w)
# * GSL::Eigen::gen_params(compute_s, compute_t, balance, w)
#
# Set some parameters which determine how the eigenvalue problem is solved
# in subsequent calls to GSL::Eigen::gen.
#
# If compute_s is set to 1, the full Schur form S will be
# computed by GSL::Eigen::gen. If it is set to 0, S will
# not be computed (this is the default setting). S is a quasi upper
# triangular matrix with 1-by-1 and 2-by-2 blocks on its diagonal.
# 1-by-1 blocks correspond to real eigenvalues, and 2-by-2 blocks
# correspond to complex eigenvalues.
#
# If compute_t is set to 1, the full Schur form T will
# be computed by GSL::Eigen::gen. If it is set to 0, T
# will not be computed (this is the default setting). T
# is an upper triangular matrix with non-negative elements on its diagonal.
# Any 2-by-2 blocks in S will correspond to a 2-by-2 diagonal block
# in T.
#
# The balance parameter is currently ignored, since generalized
# balancing is not yet implemented.
#
# ---
# * GSL::Eigen::gen(A, B, w)
#
# Computes the eigenvalues of the real generalized nonsymmetric matrix pair
# A, B, and returns them as pairs in (alpha, beta),
# where alpha is GSL::Vector::Complex and beta is GSL::Vector.
# If beta_i is non-zero, then lambda = alpha_i / beta_i is an eigenvalue.
# Likewise, if alpha_i is non-zero, then mu = beta_i / alpha_i is an
# eigenvalue of the alternate problem mu A y = B y.
# The elements of beta are normalized to be non-negative.
#
# If S is desired, it is stored in A on output.
# If T is desired, it is stored in B on output.
# The ordering of eigenvalues in alpha, beta
# follows the ordering of the diagonal blocks in the Schur forms S
# and T.
#
# ---
# * GSL::Eigen::gen_QZ(A, B, w)
#
# This method is identical to GSL::Eigen::gen except it also computes
# the left and right Schur vectors and returns them.
#
# ---
# * GSL::Eigen::Genv.alloc(n)
# * GSL::Eigen::Genv::Workspace.alloc(n)
#
# Allocatesa workspace for computing eigenvalues and eigenvectors of
# n-by-n real generalized nonsymmetric eigensystems.
# The size of the workspace is O(7n).
#
# ---
# * GSL::Eigen::genv(A, B, w)
#
# Computes eigenvalues and right eigenvectors of the n-by-n real generalized
# nonsymmetric matrix pair A, B. The eigenvalues and eigenvectors
# are returned in alpha, beta, evec.
# On output, A, B contains the generalized Schur form S, T.
#
# ---
# * GSL::Eigen::genv_QZ(A, B, w)
#
# This method is identical to GSL::Eigen::genv except it also computes
# the left and right Schur vectors and returns them.
#
# == {}[link:index.html"name="8] Sorting Eigenvalues and Eigenvectors
# ---
# * GSL::Eigen::symmv_sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Symmv::sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# These methods simultaneously sort the eigenvalues stored in the vector
# eval and the corresponding real eigenvectors stored in the
# columns of the matrix evec into ascending or descending order
# according to the value of the parameter type,
#
# * GSL::Eigen::SORT_VAL_ASC
# ascending order in numerical value
# * GSL::Eigen::SORT_VAL_DESC
# escending order in numerical value
# * GSL::Eigen::SORT_ABS_ASC
# scending order in magnitude
# * GSL::Eigen::SORT_ABS_DESC
# descending order in magnitude
#
# The sorting is carried out in-place!
#
# ---
# * GSL::Eigen::hermv_sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Hermv::sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# These methods simultaneously sort the eigenvalues stored in the vector
# eval and the corresponding complex eigenvectors stored in the columns
# of the matrix evec into ascending or descending order according
# to the value of the parameter type as shown above.
#
# ---
# * GSL::Eigen::nonsymmv_sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Nonsymmv::sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# Sorts the eigenvalues stored in the vector eval and the corresponding
# complex eigenvectors stored in the columns of the matrix evec
# into ascending or descending order according to the value of the
# parameter type as shown above.
# Only GSL::EIGEN_SORT_ABS_ASC and GSL::EIGEN_SORT_ABS_DESC
# are supported due to the eigenvalues being complex.
#
# ---
# * GSL::Eigen::gensymmv_sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Gensymmv::sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# Sorts the eigenvalues stored in the vector eval and the
# corresponding real eigenvectors stored in the columns of the matrix
# evec into ascending or descending order according to the value of
# the parameter type as shown above.
#
# ---
# * GSL::Eigen::gensymmv_sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Gensymmv::sort(eval, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# Sorts the eigenvalues stored in the vector eval and the
# corresponding complex eigenvectors stored in the columns of the matrix
# evec into ascending or descending order according to the value of
# the parameter type as shown above.
#
# ---
# * GSL::Eigen::genv_sort(alpha, beta, evec, type = GSL::Eigen::SORT_VAL_ASC)
# * GSL::Eigen::Genv::sort(alpha, beta, evec, type = GSL::Eigen::SORT_VAL_ASC)
#
# Sorts the eigenvalues stored in the vectors alpha, beta and the
# corresponding complex eigenvectors stored in the columns of the matrix
# evec into ascending or descending order according to the value of
# the parameter type as shown above. Only GSL::EIGEN_SORT_ABS_ASC
# and GSL::EIGEN_SORT_ABS_DESC are supported due to the eigenvalues
# being complex.
#
# {prev}[link:files/rdoc/linalg_rdoc.html]
# {next}[link:files/rdoc/fft_rdoc.html]
#
# {Reference index}[link:files/rdoc/ref_rdoc.html]
# {top}[link:files/rdoc/index_rdoc.html]
#
#