4

MatlabのSVD関数は、次の3つの行列を出力します。

[U,S,V] = svd(X) 

また、S行列を使用して、可能な限り最小のコンポーネント数を見つけ、Xの次元を減らして、十分な分散を保持することができます。私の質問は、 Opencvを使用しSて(マトリックスではなくU)マトリックスを見つける方法です。OpenCVSVDのビルドを使用してSマトリックスを見つけることは可能ですか?つまり、OpenCV SVD関数はMatlabのように3つの行列を出力しますが、それらが同じかどうかはわかりません。これはOpenCVのSVDです:

SVD::compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0 ) 

これはMatlabSVDです。

[U,S,V] = svd(X).

ありがとうございました。

4

2 に答える 2

9

There is a simple difference between S in Matlab and w in OpenCV.

Take this example:

A = [2, 4;
     1, 3;
     0, 0;
     0, 0]

In Matlab, S would be:

S = [5.47, 0   ;
     0   , 0.37;
     0   , 0   ;
     0   , 0   ]

But openCV gives the following as w:

w = [5.47; 0.37]

So, OpenCV gives an array of singular values, if you really want to have the S matrix, you may create a new matrix and put w's elements in its diagonal.

于 2012-08-19T21:57:38.230 に答える
3

SVD分解を実際に計算するバックエンドはMATLABとOpenCVで同じであると確信しています(どちらの場合もLAPACKで行われると思います)。ですから、やりたいことはとても簡単なようです。

どこにでもゼロがあり、対角線に沿ってwの値を持つ、同じサイズのsrcの行列を作成することにより、wをSに変換できます。これはデータ構造の単純な変更であり、値は同じになります。

于 2012-08-19T21:53:54.110 に答える