22_OpenCV中求解方程的一系列cv::solve...()函数

目录

1. 求解线性系统的函数 cv::solve()

2. 求解多项式的实根 cv::solveCubic()

3. 求解多项式的函数 cv::solvePoly()


1. 求解线性系统的函数 cv::solve()

函数原型:

int cv::solve(
	cv::InputArray lhs,  // lefthand side of system, n-by-n
	cv::InputArray rhs,  // righthand side of system, n-by-n
	cv::OutputArray dst,  // result array, will be n-by-1
	int method = cv::DECOMP_LU  // method for solve
);

计算公式:

函数说明:
上面公式中A是一个由lhs指定的方阵,B是向量rhs,C是cv::solve()计算的结果,目标是寻找一个最优向量X。最优向量X将返回给dst。用于求解此系统的实际方法由method参数决定。该函数只支持浮点数据类型。该函数将返回一个整数值,当返回的值是一个非零值的话,就表明找到了一个解。method参数的可能的值如下:

method参数的值 意义
cv::DECOMP_LU 高斯消元法(LU分解)
cv::DECOMP_SVD 奇异值分解(SVD)
cv::DECOMP_CHOLESKY 对于对称正定矩阵
cv::DECOMP_EIG 特征值分解,只用于对称矩阵
cv::DECOMP_QR QR因式分解
cv::DECOMP_NORMAL 可选附加标志,表示要求解标准方程

值得关注的是cv::DECOMP_LU和cv::DECOMP_CHOLESKY的方法不能用于奇异矩阵。如果提供一个奇异的lhs参数,两个方法都将退出并返回0(如果lhs是非奇异的,则返回1)。可以使用cv::solve()中的QR分解(cv::DECOMP_QR)或奇异值分解(cv::DECOMP_SVD)来求解给定方程组的最小二乘解,从而求解超定线性系统,这两种方法在矩阵lhs奇异的情况下也可以使用。

上表中的前五个参数是互斥的,但是最后一个参数可以与前面五个中的任何一个组合。如果使用了cv::DECOMP_NORMAL,那么cv::solve()将尝试解决标准方程:,而不是一般方程:

2. 求解多项式的实根 cv::solveCubic()

函数原型:

int cv::solveCubic(
	cv::InputArray coeffs,
	cv::OutputArray roots  
);

函数说明:
给定由三个或四个元素向量系数表示的三次多项式,cv::solveCubic将计算该多项式的实根,如果coeffs有四个元素,则计算以下多项式的根:

如果coeffs只有三个元素,则计算以下多项式的根:
​​​​​​​
结果会存储在矩阵roots中,它将具有一个或三个元素,具体取决于多项式具有多少个实根。

3. 求解多项式的函数 cv::solvePoly()

函数原型:

int cv::solvePoly(
	cv::InputArray coedds,
	cv::OutputArray roots,  // n complex root (2-channels)
	int maxIters = 300  // maximum iterations for solve
);

函数说明:
给定以系数向量表示的任意阶数的多项式,cv::solvePoly()将尝试计算该多项式的根。给定系数矩阵,计算如下多项式的根:

这些根不能保证是实根,对于n阶多项式(即具有n+1个元素的coeffs),将存在n个根。因此,矩阵roots将返回双通道(实部,虚部)双精度矩阵。

值得关注的是cv::solveCubic和cv::colvePoly()两个函数的输入矩阵的系数的顺序是相反的。在cv::solveCubic中,最高阶系数在最后一个,而cv::solvePoly()中,最高阶系数在第一个。

你可能感兴趣的:(openCv,opencv)