使用Eigen的空间空间计算是错误的?

时间:2013-03-29 21:58:38

标签: eigen svd

我正在使用特征库(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

感谢您的协助!

1 个答案:

答案 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有一个明显的区别。)