我正在使用特征库(http://eigen.tuxfamily.org)使用SVD函数进行空间空间计算。我将输出与matlab中的“Null”函数进行了比较,得到了不同的结果。使用调试器逐步执行它,并查看由Elab创建的V矩阵与matlab中的V矩阵,这是一个奇怪的区别。
V矩阵中的左奇异向量(下例中左3列)几乎相同,但是符号被切换。右奇异向量(零空间;右下3列)完全不相似。
任何想法会导致什么?我是否错误地使用了SVD功能?代码和示例结果如下。
这是代码:“input”是一个普通的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(Eigen)=
-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
感谢您的协助!
答案 0 :(得分:4)
首先,有一种方法可以形成空间的标准正交基。 (例如[1 0; 0 1]
和1/sqrt(2) * [ 1 -1; 1 1 ]
都描述了相同的2D欧几里德空间。因此,我们不一定期望两种替代实现选择相同的基础集。
如果我们在每种情况下采用右侧三列,我们将学习以下内容:
> 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
所以这些都是正交基组,它们都是基本零空间。但是,特征情况下的误差水平似乎与它以单精度完成的事实相对应。以双精度再次尝试,看看结果如何比较这一次(我没有声称这肯定有帮助,只是这与Matlab有一个明显的区别。)