OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。

特異値分解 (Singular Value Decomposition)。 続き...

#include <opencv2/core.hpp>

Collaboration diagram for 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
 

詳細説明

特異値分解 (Singular Value Decomposition)。

浮動小数点行列の特異値分解 (Singular Value Decomposition) を計算するためのクラス。特異値分解は、最小二乗問題や劣決定の線形系を解いたり、行列を逆にしたり、条件数を計算したりといった用途に使われる。

行列の条件数や行列式の絶対値を計算したい場合、uvt は必要ない。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/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
TODOTodo
ドキュメント

◆ 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
TODOTodo
ドキュメント

◆ 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
TODOTodo
ドキュメント

◆ 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-dimensional dense array class
Definition mat.hpp:840
Mat w
Definition core.hpp:2866
static void compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0)
decomposes matrix and stores the results to user-provided matrices
Mat vt
Definition core.hpp:2866
Mat u
Definition core.hpp:2866
引数
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

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