class cv::SVD

Overview

Singular Value Decomposition. More…

#include <core.hpp>

class SVD
{
public:
    // enums

    enum Flags;

    // fields

    Mat u;
    Mat vt;
    Mat w;

    // construction

    SVD();

    SVD(
        InputArray src,
        int flags = 0
        );

    // methods

    void
    backSubst(
        InputArray rhs,
        OutputArray dst
        ) const;

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

    static
    void
    backSubst(
        InputArray w,
        InputArray u,
        InputArray vt,
        InputArray rhs,
        OutputArray dst
        );

    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
    compute(
        InputArray src,
        OutputArray w,
        OutputArray u,
        OutputArray vt,
        int flags = 0
        );

    static
    void
    compute(
        InputArray src,
        OutputArray w,
        int flags = 0
        );

    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
        );

    template <
        typename _Tp,
        int m,
        int n,
        int nm
        >
    static
    void
    compute(
        const Matx<_Tp, m, n>& a,
        Matx<_Tp, nm, 1>& w
        );

    static
    void
    solveZ(
        InputArray src,
        OutputArray dst
        );
};

Detailed Documentation

Singular Value Decomposition.

Class for computing Singular Value Decomposition of a floating-point matrix. The Singular Value Decomposition is used to solve least-square problems, under-determined linear systems, invert matrices, compute condition numbers, and so on.

If you want to compute a condition number of a matrix or an absolute value of its determinant, you do not need u and vt. You can pass flags= SVD::NO_UV |… . Another flag SVD::FULL_UV indicates that full-size u and vt must be computed, which is not necessary most of the time.

See also:

invert, solve, eigen, determinant

Construction

SVD()

the default constructor

initializes an empty SVD structure

SVD(
    InputArray src,
    int flags = 0
    )

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. initializes an empty SVD structure and then calls SVD::operator()

Parameters:

src decomposed matrix.
flags operation flags (SVD::Flags)

Methods

void
backSubst(
    InputArray rhs,
    OutputArray dst
    ) const

performs a singular value back substitution.

The method calculates a back substitution for the specified right-hand side:

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

Using this technique you can either get a very accurate solution of the convenient linear system, or the best (in the least-squares terms) pseudo-solution of an overdetermined linear system.

Explicit SVD with the further back substitution only makes sense if you need to solve many linear systems with the same left-hand side (for example, src ). If all you need is to solve a single system (possibly with multiple rhs immediately available), simply call solve add pass DECOMP_SVD there. It does absolutely the same thing.

Parameters:

rhs right-hand side of a linear system (u*w*v’)*dst = rhs to be solved, where A has been previously decomposed.
dst found solution of the system.
SVD&
operator()(
    InputArray src,
    int flags = 0
    )

the operator that performs SVD. The previously allocated u, w and vt are released.

The operator performs the singular value decomposition of the supplied matrix. The u, vt, and the vector of singular values w are stored in the structure. The same SVD structure can be reused many times with different matrices. Each time, if needed, the previous u, vt, and w are reclaimed and the new matrices are created, which is all handled by Mat::create.

Parameters:

src decomposed matrix.
flags operation flags (SVD::Flags)
static
void
backSubst(
    InputArray w,
    InputArray u,
    InputArray vt,
    InputArray rhs,
    OutputArray dst
    )

performs back substitution

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
    )

Todo document

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

decomposes matrix and stores the results to user-provided matrices

The methods/functions perform SVD of matrix. Unlike SVD::SVD constructor and SVD::operator(), they store the results to the user-provided matrices:

Mat A, w, u, vt;
SVD::compute(A, w, u, vt);

Parameters:

src decomposed matrix
w calculated singular values
u calculated left singular vectors
vt transposed matrix of right singular values
flags operation flags - see SVD::SVD.
static
void
compute(
    InputArray src,
    OutputArray w,
    int flags = 0
    )

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. computes singular values of a matrix

Parameters:

src decomposed matrix
w calculated singular values
flags operation flags - see SVD::Flags.
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
    )

Todo document

template <
    typename _Tp,
    int m,
    int n,
    int nm
    >
static
void
compute(
    const Matx<_Tp, m, n>& a,
    Matx<_Tp, nm, 1>& w
    )

Todo document

static
void
solveZ(
    InputArray src,
    OutputArray dst
    )

solves an under-determined singular linear system

The method finds a unit-length solution x of a singular linear system A*x = 0. Depending on the rank of A, there can be no solutions, a single solution or an infinite number of solutions. In general, the algorithm solves the following problem:

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

Parameters:

src left-hand-side matrix.
dst found solution.