2

Eigen ライブラリ ( http://eigen.tuxfamily.org ) を使用して、SVD 関数を使用して Null Space 計算を実行しています。出力をmatlabの「Null」関数と比較したところ、異なる結果が得られました。デバッガーでそれをステップ実行し、Eigen によって作成された V マトリックスと matlab からの V マトリックスを見ると、奇妙な違いがあります。

V 行列の左特異ベクトル (下の例では左 3 列) はほぼ同じですが、符号が入れ替わっています。右特異ベクトル (ヌル空間、下の右 3 列) はまったく似ていません。

何が原因でしょうか?SVD 関数の使い方が間違っていますか? 以下のコードと結果の例。

コードは次のとおりです。「入力」は通常の C++ 配列です。

/* Create a matrix with the nessecary size */
MatrixXf A(inRows, inCols);

/* Populate the matrix from the input */
for (int i=0; i < inRows; i++)
{
  for(int j=0; j < inCols; j++)
  {
    A(i,j) = input[i*inCols + j];
  }
}

/* Do a singular value decomposition on the matrix */
JacobiSVD<MatrixXf> svd(A, Eigen::ComputeFullV);

/* Get the V matrix */
MatrixXf V((int)svd.matrixV().rows(), (int)svd.matrixV().cols());
V = svd.matrixV();

結果の例を次に示します。

A(入力) =

-0.5059    -0.0075   -0.0121   -0.3526   -0.3528   -0.0128
-0.0067     0.4915    0.0235   -0.3503    0.3559    0.0211
 0.0027     0.0010   -0.5015    0.0021   -0.0031   -0.4999

V(マトラブ) =

 0.3120    0.6304    0.1115   -0.5031   -0.4895   -0.0027
 0.3628   -0.2761    0.5333    0.4955   -0.5121   -0.0018
 0.5180   -0.1804   -0.4480   -0.0002    0.0000   -0.7060
-0.0353    0.6404   -0.2953    0.7081    0.0074   -0.0023
 0.4859    0.2283    0.4623    0.0032    0.7057    0.0048
 0.5151   -0.1775   -0.4489    0.0014   -0.0080    0.7082

V(固有値) =

-0.3120   -0.6304   -0.1115   -0.5040   -0.4886   -0.0038
-0.3628    0.2761   -0.5333    0.4638   -0.4832    0.2432
-0.5180    0.1804    0.4480    0.1693   -0.1736   -0.6630
 0.0353   -0.6404    0.2953    0.6878    0.0257    0.1666
-0.4859   -0.2283   -0.4623    0.0258    0.6851   -0.1677
-0.5151    0.1775    0.4489   -0.1689    0.1665    0.6674

ご協力いただきありがとうございます!

4

1 に答える 1

4

まず、空間の正規直交基底を形成する方法は複数あります。(たとえば[1 0; 0 1]1/sqrt(2) * [ 1 -1; 1 1 ]両方とも同じ 2D ユークリッド空間を記述します)。したがって、2 つの代替実装が同じ基底セットを選択するとは必ずしも期待できません。

それぞれのケースで右側の 3 つの列を使用すると、次のことがわかります。

> Vmat = Vmat(:,4:end);
> Veig = Veig(:,4:end);
> Vmat' * V_mat

ans =

 1.0000e+00   8.8800e-06  -1.4120e-05
 8.8800e-06   9.9999e-01  -5.1830e-05
-1.4120e-05  -5.1830e-05   1.0000e+00

> Veig' * Veig

ans = 

 1.0001e+00  -1.4050e-05   2.4200e-06
-1.4050e-05   1.0001e+00  -4.8310e-05
 2.4200e-06  -4.8310e-05   1.0000e+00

> A * Vmat

ans =

 7.7612e-17   7.8916e-17   0.0000e+00
-4.1193e-17   4.8139e-17   0.0000e+00
 6.6136e-18  -6.0715e-18   1.1102e-16

> A * Veig

ans = 

-1.2030e-05   1.1000e-05  -6.0000e-07
-4.8600e-06   3.8750e-05   1.5490e-05
-3.4400e-06  -4.5210e-05  -3.6090e-05

したがって、これらはどちらも正規直交基底セットであり、どちらも基本的にヌル空間です。ただし、Eigen の場合のエラー レベルは、単精度で行われたという事実に対応しているように見えます。倍精度でもう一度試して、今回の結果を比較してみてください (これが確実に役立つとは言いませんが、これは Matlab との明らかな違いの 1 つにすぎません)。

于 2013-03-29T22:02:38.120 に答える