OpenCV 4.5.3(日本語機械翻訳)
公開型 | 公開メンバ関数 | 静的公開メンバ関数 | 公開変数類 | 全メンバ一覧

Singular Value Decomposition [詳解]

#include <core.hpp>

公開型

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

公開メンバ関数

SVD ()
デフォルトコンストラクタ[【詳解】(英語]
SVD (InputArray src, int flags=0)
SVD & operator() (InputArray src, int flags=0)
を実行する演算子.SVD. 先に確保された u, w, vt は解放されます.[【詳解】(英語]
void backSubst (InputArray rhs, OutputArray dst) const
特異値後退代入を行います.[【詳解】(英語]

静的公開メンバ関数

static void compute (InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0)
行列を分解し,その結果をユーザが用意した行列に格納します.[【詳解】(英語]
static void compute (InputArray src, OutputArray w, int flags=0)
static void backSubst (InputArray w, InputArray u, InputArray vt, InputArray rhs, OutputArray dst)
背面置換を行います.
static void solveZ (InputArray src, 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, 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)
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)

公開変数類

Mat u
Mat w
Mat vt

詳解

特異値分解(Singular Value Decomposition)

浮動小数点行列の特異値分解を計算するクラス。特異値分解は,最小二乗問題,過小決定された連立方程式,行列の反転,条件数の計算などに利用されます.

行列の条件数や行列式の絶対値を計算したい場合は、次のようなものは必要ありません。uおよびvt. flags= を渡すことができます.SVD::NO_UV|... . 別のフラグSVD::FULL_UVは,フルサイズのuとvtを計算しなければならないことを示していますが,ほとんどの場合は必要ありません.

参照
invert,solve,eigen,determinant

列挙型メンバ詳解

Flags

列挙値
MODIFY_A

アルゴリズムが分解された行列を修正することを許可します.これは,スペースを節約し,処理を高速化することができます.

NO_UV

は,特異値のベクトルのみを処理することを示します.wが処理されることを示し,u と vt は空の行列に設定されます.

FULL_UV

行列が正方でない場合,デフォルトでは,アルゴリズムは,さらなるA再構成のために十分な大きさの u と vt の行列を生成します.しかし,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/2]

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
todo:
ドキュメント

backSubst() [2/2]

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 to be solved, ここでAは事前に分解されている。
dst 連立方程式の発見された解。
覚え書き
明示的SVDは,同じ左辺を持つ多くの連立方程式を解く必要がある場合にのみ意味があります(たとえば,src ).単一の連立方程式(複数の Rhs がすぐに得られる場合もある)を解きたいだけならば,単に solve add passDECOMP_SVDを呼び出してください。全く同じことができます。

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
todo:
ドキュメント

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
todo:
ドキュメント

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;
SVD::compute(A, w, u, vt);
static void compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0)
decomposes matrix and stores the results to user-provided matrices
引数
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 見つかった解。

このクラス詳解は次のファイルから抽出されました: