我正在使用 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(Matlab) =
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
谢谢您的帮助!