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(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

谢谢您的帮助!

4

1 回答 1

4

首先,形成空间正交基的方法不止一种。(例如[1 0; 0 1]1/sqrt(2) * [ 1 -1; 1 1 ]两者都描述了相同的二维欧几里得空间)。所以我们不一定期望两个替代实现选择相同的基组。

如果我们在每种情况下取​​右侧的三列,我们会学到以下内容:

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

于 2013-03-29T22:02:38.120 回答