当前位置:   article > 正文

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

cv::solve

目录

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

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

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


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

函数原型:

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

计算公式:

函数说明:
上面公式中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_QRQR因式分解
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()

函数原型:

  1. int cv::solveCubic(
  2. cv::InputArray coeffs,
  3. cv::OutputArray roots
  4. );

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

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

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

函数原型:

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/153360
推荐阅读
相关标签
  

闽ICP备14008679号