version 2.3 ぐらいからある class SVD の使い方
古き良き cvSVD()
と違って、 class SVD
というものが導入されている。マニュアルにはなぜか class SVD
の定義が載ってないので、 opencv2/core/core.hpp
を見ると、
class SVD { public: SVD(); SVD(const Mat& src, int flags=0); SVD& operator()(const Mat& src, int flags=0); static void compute( const Mat& src, CV_OUT Mat& w, int flags=0 ); ... Mat u, w, vt; };
となっている。
static メソッドで cvSVD()
相当のものがあるので、インスタンスを作らず、
SVD::compute(A, W, U, V);
と、指定した配列に計算結果を格納できる。
クラスのコンストラクタで計算させると、結果をメンバ変数として保持してくれる。配列を用意する手間が省ける。
SVD const decompA(A); // decompA.u, decompA.w, decompA.vt でそれぞれの計算結果を読みだす。
コンストラクタは SVD::operator() を呼んでいるだけ。つまり、
SVD decompA; decompA(A);
でもいい。使いまわしてもいい。
最小の特異値に対応するベクトルを求める static メソッドが用意されている。これは、 Ax = 0 を満たす単位ベクトルの一つである。
零空間の基底を求める問題、 Ax = 0 を解く static メソッドも用意されている。
参考→ id:DOSEI:20061229:p1, id:DOSEI:20070216:p1
SVD::SolveZ(A, N);