几个CGAL包必须解决稠密或稀疏矩阵的线性系统、线性整数规划和二次规划。这个包为此提供了概念和模型。
对于线性系统,我们通常使用Eigen库提供模型。 Eigen类Eigen_matrix和Eigen_vector的封装器也在需要时提供。为其他求解器开发等效模型很简单,例如在英特尔数学内核库(MKL)中发现的那些。
对于混合整数规划(有约束或无约束),我们使用SCIP和GLPK库提供模型。
对于线性和二次规划,CGAL 库提供了内置的 CGAL 线性与二次规划求解器,我们还提供了一个使用 OSQP 库的模型。
概念 DiagonalizeTraits
typedef CGAL::Eigen_diagonalize_traits Diagonalize_traits;
Diagonalize_traits::diagonalize_selfadjoint_covariance_matrix
(covariance,eigenvalues,eigenvectors))
概念 SvdTraits 定义了一个接口,用于通过奇异值分解以最小二乘法解决线性系统。 字段类型为 double。我们提供了使用 Eigen 库的模型 Eigen_svd。
typedef CGAL::Eigen_svd Svd;
Svd::solve(M, B)
我们定义了稀疏线性代数的3个概念:
SparseLinearAlgebraTraits_d
SparseLinearAlgebraWithFactorTraits_d
NormalEquationSparseLinearAlgebraTraits_d
Eigen库中的稀疏求解器接口通过Eigen_solver_traits类作为这3个概念的模型。该求解器traits类可用于迭代或直接、对称或通用的稀疏求解器。要使用的特定求解器必须作为模板参数给出。
每个使用稀疏求解器的万达包都指定了所需的矩阵和求解器类型
typedef CGAL::Eigen_sparse_matrix::EigenType EigenMatrix;
typedef CGAL::Eigen_solver_traits< Eigen::BiCGSTAB > Iterative_general_solver;
typedef CGAL::Eigen_solver_traits< Eigen::ConjugateGradient > Iterative_symmetric_solver;
typedef CGAL::Eigen_solver_traits< Eigen::SimplicialCholesky > Direct_symmetric_solver;
字段类型为 double。我们提供了两个此概念模型:CGAL::GLPK_mixed_integer_program_traits 使用 GLPK 和 CGAL::SCIP_mixed_integer_program_traits 使用 SCIP。
typedef CGAL::SCIP_mixed_integer_program_traits MIP_Solver;
typedef CGAL::GLPK_mixed_integer_program_traits MIP_Solver;
typedef typename MIP_Solver::Variable Variable;
typedef typename MIP_Solver::Linear_objective Linear_objective;
typedef typename MIP_Solver::Linear_constraint Linear_constraint;
概念 QuadraticProgram Traits 为二次规划 (QP) 定义了一个接口,而类似的概念 LinearProgram Traits 为线性规划 (LP) 定义了一个接口。模型CGAL::OSQP_quadratic_program_traits 提供了一种使用稠密或稀疏接口求解凸二次规划的方法。
矩阵对角化(Matrix Diagonalization)是线性代数中的一个重要概念,它涉及到将一个矩阵分解为一个对角矩阵和一个上三角矩阵的乘积。这种分解方式对于解决一些线性代数问题,如求解线性方程组、计算矩阵的逆和行列式等,是非常有用的。
具体来说,对于一个给定的矩阵A,如果存在一个可逆矩阵P和对角矩阵D,使得P^(-1)AP=D,则称矩阵A是可对角化的。对角化矩阵的过程可以通过求解特征值和特征向量来实现。
在实际应用中,对角化矩阵对于理解和解决许多问题都非常有用。例如,在控制理论中,对角化矩阵可以帮助我们理解系统的稳定性和性能;在量子力学中,对角化矩阵可以用于描述系统的状态和演化;在机器学习中,对角化矩阵可以用于降维和特征提取等任务。
需要注意的是,不是所有的矩阵都可以对角化。对于不可对角化的矩阵,我们可以通过其他方法来求解相关问题,如使用Jordan分解或SVD分解等。
CGAL 5.6 - CGAL and Solvers: User Manual