DOSEIの日記

技術メモ+日常ログ

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