cv::SVD::compute
static void cv::SVD::compute | ( | InputArray | src, |
---|---|---|---|
OutputArray | w, | ||
OutputArray | u, | ||
OutputArray | vt, | ||
int | flags = 0 | ||
) |
参数:
//A=u*w*vt
src decomposed matrix
w calculated singular values
u calculated left singular vectors
vt transposed matrix of right singular values
flags operation flags
flags可以选的参数:
Enumerator | flag | |
SVD::MODIFY_A | 1 | allow the algorithm to modify the decomposed matrix; it can save space and speed up processing. currently ignored. |
SVD::NO_UV | 2 | indicates that only a vector of singular values w is to be processed, while u and vt will be set to empty matrices |
SVD::FULL_UV | 4 | when the matrix is not square, by default the algorithm produces u and vt matrices of sufficiently large size for the further A reconstruction; if, however, FULL_UV flag is specified, u and vt will be full-size square orthogonal matrices. |
//使用方法
Mat A, w, u, vt;
cv::SVD::compute(A, w, u, vt,SVD::FULL_UV);
cv::SVDecomp(A,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);
cv::SVDecomp
也是调用的上面函数
void cv::SVDecomp(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags)
{
CV_INSTRUMENT_REGION()
SVD::compute(src, w, u, vt, flags);
}
SVD计算方法
奇异值分解定义:
有一个m×n的实数矩阵A,我们想要把它分解成如下的形式:
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT
其中U和V均为单位正交阵
具体计算可以参考:https://byjiang.com/2017/11/18/SVD/
或者:奇异值分解与应用
主要利用如下性质:
A
A
T
=
U
Σ
V
T
V
Σ
T
U
T
=
U
Σ
Σ
T
U
T
A
T
A
=
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
T
Σ
V
T
AA^T=U\Sigma V^TV\Sigma^TU^T=U\Sigma\Sigma^TU^T\\ A^TA=V\Sigma^T U^TU\Sigma V^T=V\Sigma^T\Sigma V^T\\
AAT=UΣVTVΣTUT=UΣΣTUTATA=VΣTUTUΣVT=VΣTΣVT
Σ Σ T = [ σ 1 2 0 ⋯ 0 0 σ 2 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ σ m 2 ] , Σ T Σ = [ σ 1 2 0 ⋯ 0 0 σ 2 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ σ n 2 ] \Sigma\Sigma^T= \left[ \begin{matrix} \sigma_1^2 & 0 & \cdots & 0 \\ 0 & \sigma_2^2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_m^2 \\ \end{matrix} \right], \Sigma^T\Sigma= \left[ \begin{matrix} \sigma_1^2 & 0 & \cdots & 0 \\ 0 & \sigma_2^2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_n^2 \\ \end{matrix} \right] ΣΣT=⎣⎢⎢⎢⎡σ120⋮00σ22⋮0⋯⋯⋱⋯00⋮σm2⎦⎥⎥⎥⎤,ΣTΣ=⎣⎢⎢⎢⎡σ120⋮00σ22⋮0⋯⋯⋱⋯00⋮σn2⎦⎥⎥⎥⎤
参考
https://docs.opencv.org/3.1.0/d2/de8/group__core__array.html#gab477b5b7b39b370bb03e75b19d2d5109