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
ご協力いただきありがとうございます!