OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
公共类型 | 公共成员函数 | 静态公共成员函数 | 公共属性 | 所有成员列表
cv::SVD 类参考

奇异值分解。 更多...

#include <opencv2/core.hpp>

cv::SVD 的协作图

公共类型

enum  Flags {
  MODIFY_A = 1 ,
  NO_UV = 2 ,
  FULL_UV = 4
}
 

公共成员函数

 SVD ()
 默认构造函数
 
 SVD (InputArray src, int flags=0)
 
void backSubst (InputArray rhs, OutputArray dst) const
 执行奇异值反向替换。
 
SVDoperator() (InputArray src, int flags=0)
 执行 SVD 的运算符。先前分配的 u、w 和 vt 将被释放。
 

静态公共成员函数

template<typename _Tp , int m, int n, int nm, int nb>
static void backSubst (const Matx< _Tp, nm, 1 > &w, const Matx< _Tp, m, nm > &u, const Matx< _Tp, n, nm > &vt, const Matx< _Tp, m, nb > &rhs, Matx< _Tp, n, nb > &dst)
 
static void backSubst (InputArray w, InputArray u, InputArray vt, InputArray rhs, OutputArray dst)
 执行反向替换
 
template<typename _Tp , int m, int n, int nm>
static void compute (const Matx< _Tp, m, n > &a, Matx< _Tp, nm, 1 > &w)
 
template<typename _Tp , int m, int n, int nm>
static void compute (const Matx< _Tp, m, n > &a, Matx< _Tp, nm, 1 > &w, Matx< _Tp, m, nm > &u, Matx< _Tp, n, nm > &vt)
 
static void compute (InputArray src, OutputArray w, int flags=0)
 
static void compute (InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0)
 将矩阵分解并存储结果到用户提供的矩阵中
 
static void solveZ (InputArray src, OutputArray dst)
 求解欠定的奇异线性系统
 

公共属性

Mat u
 
Mat vt
 
Mat w
 

详细描述

奇异值分解。

用于计算浮点矩阵奇异值分解的类。奇异值分解用于求解最小二乘问题、欠定线性系统、矩阵求逆、计算条件数等。

如果您想计算矩阵的条件数或其行列式的绝对值,则不需要 uvt。您可以传递 flags=SVD::NO_UV|...。另一个标志 SVD::FULL_UV 表示必须计算全尺寸 u 和 vt,这在大多数情况下是不必要的。

另请参阅
invert, solve, eigen, determinant

成员枚举文档

◆ Flags

枚举器
MODIFY_A 

允许算法修改分解后的矩阵;它可以节省空间并加快处理速度。当前忽略。

NO_UV 

表示仅要处理奇异值向量 w,而 u 和 vt 将被设置为空矩阵

FULL_UV 

当矩阵不是方阵时,默认情况下,该算法会生成足够大的尺寸的 u 和 vt 矩阵,以便进一步重建 A;但是,如果指定了 FULL_UV 标志,u 和 vt 将是全尺寸方正交矩阵。

构造函数和析构函数文档

◆ SVD() [1/2]

cv::SVD::SVD ( )

默认构造函数

初始化一个空的 SVD 结构

◆ SVD() [2/2]

cv::SVD::SVD ( InputArray  src,
int  flags = 0 
)

这是一个重载的成员函数,为了方便起见。它与上面的函数的区别仅在于它接受的参数。初始化一个空的 SVD 结构,然后调用 SVD::operator()

参数
src分解后的矩阵。深度必须为 CV_32F 或 CV_64F。
flags操作标志 (SVD::Flags)

成员函数文档

◆ backSubst() [1/3]

template<typename _Tp , int m, int n, int nm, int nb>
static void cv::SVD::backSubst ( const Matx< _Tp, nm, 1 > &  w,
const Matx< _Tp, m, nm > &  u,
const Matx< _Tp, n, nm > &  vt,
const Matx< _Tp, m, nb > &  rhs,
Matx< _Tp, n, nb > &  dst 
)
static
待办事项
文档

◆ backSubst() [2/3]

void cv::SVD::backSubst ( InputArray  rhs,
OutputArray  dst 
) const

执行奇异值反向替换。

该方法计算指定右侧的反向替换

\[\texttt{x} = \texttt{vt} ^T \cdot diag( \texttt{w} )^{-1} \cdot \texttt{u} ^T \cdot \texttt{rhs} \sim \texttt{A} ^{-1} \cdot \texttt{rhs}\]

使用此技术,您可以获得线性系统的非常精确的解,或者获得超定线性系统的最佳(从最小二乘的角度来看)伪解。

参数
rhs要解的线性系统 (u*w*v')*dst = rhs 的右侧,其中 A 已被先前分解。
dst找到的系统解决方案。
注意
显式 SVD 以及随后的反向替换只有在您需要用相同的左侧(例如,src)求解许多线性系统时才有意义。如果您只需要求解单个系统(可能有多个 rhs 立即可用),只需调用 solve 并传递 DECOMP_SVD。它所做的事情完全一样。

◆ backSubst() [3/3]

static void cv::SVD::backSubst ( InputArray  w,
InputArray  u,
InputArray  vt,
InputArray  rhs,
OutputArray  dst 
)
static

执行反向替换

◆ compute() [1/4]

template<typename _Tp , int m, int n, int nm>
static void cv::SVD::compute ( const Matx< _Tp, m, n > &  a,
Matx< _Tp, nm, 1 > &  w 
)
static
待办事项
文档

◆ compute() [2/4]

template<typename _Tp , int m, int n, int nm>
static void cv::SVD::compute ( const Matx< _Tp, m, n > &  a,
Matx< _Tp, nm, 1 > &  w,
Matx< _Tp, m, nm > &  u,
Matx< _Tp, n, nm > &  vt 
)
static
待办事项
文档

◆ compute() [3/4]

static void cv::SVD::compute ( InputArray  src,
OutputArray  w,
int  flags = 0 
)
static

这是一个重载的成员函数,为了方便起见。它与上面的函数的区别仅在于它接受的参数。计算矩阵的奇异值

参数
src分解后的矩阵。深度必须为 CV_32F 或 CV_64F。
w计算出的奇异值
flags操作标志 - 请参阅 SVD::Flags

◆ compute() [4/4]

static void cv::SVD::compute ( InputArray  src,
OutputArray  w,
OutputArray  u,
OutputArray  vt,
int  flags = 0 
)
static

将矩阵分解并存储结果到用户提供的矩阵中

这些方法/函数执行矩阵的SVD。与SVD::SVD构造函数和 SVD::operator() 不同,它们将结果存储到用户提供的矩阵中

Mat A, w, u, vt;
n 维稠密数组类
定义 mat.hpp:812
Mat w
定义 core.hpp:2873
static void compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0)
将矩阵分解并存储结果到用户提供的矩阵中
Mat vt
定义 core.hpp:2873
Mat u
定义 core.hpp:2873
参数
src分解后的矩阵。深度必须为 CV_32F 或 CV_64F。
w计算出的奇异值
u计算的左奇异向量
vt右奇异向量的转置矩阵
flags操作标志 - 请参阅 SVD::Flags

◆ operator()()

SVD & cv::SVD::operator() ( InputArray  src,
int  flags = 0 
)

执行 SVD 的运算符。先前分配的 u、w 和 vt 将被释放。

该运算符执行提供的矩阵的奇异值分解。u、vt 和奇异值向量 w 存储在结构中。相同的 SVD 结构可以与不同的矩阵重复使用多次。每次,如果需要,之前的 u、vt 和 w 将被回收,并创建新的矩阵,所有这些都由 Mat::create 处理。

参数
src分解后的矩阵。深度必须为 CV_32F 或 CV_64F。
flags操作标志 (SVD::Flags)

◆ solveZ()

static void cv::SVD::solveZ ( InputArray  src,
OutputArray  dst 
)
static

求解欠定的奇异线性系统

该方法找到奇异线性系统 A*x = 0 的单位长度解 x。根据 A 的秩,可能没有解、只有一个解或有无限多个解。通常,该算法解决以下问题

\[dst = \arg \min _{x: \| x \| =1} \| src \cdot x \|\]

参数
src左手边矩阵。
dst找到的解决方案。

成员数据文档

◆ u

Mat cv::SVD::u

◆ vt

Mat cv::SVD::vt

◆ w

Mat cv::SVD::w

该类的文档是从以下文件生成的