【问题标题】:Null Space Calculation using Eigen is wrong?使用 Eigen 计算零空间是错误的?
【发布时间】:2016-11-27 20:24:49
【问题描述】:

我正在使用 Eigen 库 (http://eigen.tuxfamily.org) 使用 SVD 函数进行零空间计算。我将输出与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

感谢您的帮助!

【问题讨论】:

    标签: eigen svd


    【解决方案1】:

    首先,形成空间正交基的方法不止一种。 (例如[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 的一个明显区别。)

    【讨论】:

    • 对于任何给定的矩阵,零空间是否应该是唯一的,因为它是 Ax=0 的向量 x 的集合?
    • @user2221699:空空间是唯一的。但有多种描述方式。
    • 谢谢,我没想到单精度和双精度会如此改变结果。我将修改代码以使用双精度,看看它如何改变结果。
    • 你好 npulaski,我想问一下你改成双精度后发生了什么?
    • 嗨,保罗,很抱歉响应缓慢。自从我这样做已经有一段时间了,但我确实让它工作了,所以我相信一旦我切换到双精度,结果是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多