![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
特異値分解 (Singular Value Decomposition)。 続き...
#include <opencv2/core.hpp>
公開型 | |
| 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 |
| 特異値逆代入を実行する。 | |
| SVD & | operator() (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 |
特異値分解 (Singular Value Decomposition)。
浮動小数点行列の特異値分解 (Singular Value Decomposition) を計算するためのクラス。特異値分解は、最小二乗問題や劣決定の線形系を解いたり、行列を逆にしたり、条件数を計算したりといった用途に使われる。
行列の条件数や行列式の絶対値を計算したい場合、u と vt は必要ない。flags=SVD::NO_UV|... を渡せばよい。別のフラグ SVD::FULL_UV は、フルサイズの u と vt を計算する必要があることを示すが、これはほとんどの場合不要である。
| enum cv::SVD::Flags |
| cv::SVD::SVD | ( | ) |
デフォルトコンストラクタ
空の SVD 構造体を初期化する
| cv::SVD::SVD | ( | InputArray | src, |
| int | flags = 0 ) |
これは利便性のために提供されているオーバーロードされたメンバ関数である。受け取る引数のみが上記の関数と異なる。空の SVD 構造体を初期化し、続いて SVD::operator() を呼び出す
| src | 分解する行列。ビット深度は CV_32F または CV_64F でなければならない。 |
| flags | 演算フラグ(SVD::Flags) |
|
static |
| 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 | システムの求めた解。 |
|
static |
逆代入を実行する
|
static |
|
static |
|
static |
これは利便性のために提供されているオーバーロードされたメンバ関数である。受け取る引数のみが上記の関数と異なる。行列の特異値を計算する
| src | 分解する行列。ビット深度は CV_32F または CV_64F でなければならない。 |
| w | 計算された特異値 |
| flags | 演算フラグ - SVD::Flags を参照。 |
|
static |
行列を分解し、結果をユーザが指定した行列に格納する
これらのメソッド/関数は行列の SVD を実行する。SVD::SVD コンストラクタや SVD::operator() とは異なり、結果をユーザが指定した行列に格納する:
| src | 分解する行列。ビット深度は CV_32F または CV_64F でなければならない。 |
| w | 計算された特異値 |
| u | 計算された左特異ベクトル |
| vt | 右特異ベクトルの転置行列 |
| flags | 演算フラグ - SVD::Flags を参照。 |
| 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) |
|
static |
劣決定の特異線形系を解く
このメソッドは、特異線形系 A*x = 0 の単位長の解 x を求める。A のランクに応じて、解が存在しない場合、唯一の解が存在する場合、無限個の解が存在する場合がある。一般に、このアルゴリズムは次の問題を解く:
\[dst = \arg \min _{x: \| x \| =1} \| src \cdot x \|\]
| src | 左辺の行列。 |
| dst | 求められた解。 |
| Mat cv::SVD::u |
| Mat cv::SVD::vt |
| Mat cv::SVD::w |