SVD(奇异值分解)的不同结果

Different results of SVD (Singular values decomposition)

我正在尝试将 matlab 代码转换为 C。该 matlab 代码使用 3x3 矩阵的奇异值分解 (SVD),我使用数字 reciepes 在 C 中实现了该矩阵。 matlab 代码稍后使用正确的奇异向量,在某些情况下,我测试了 Matlab 和 C 之间的不同,第二列和第三列被交换,或者某些值是相反的。在某些情况下,这些值是相同的。以下是一些示例:

Expl1:(不考虑舍入误差的相同值)

Matlab:

   -0.3939    0.9010    0.1819
    0.6583    0.1385    0.7399
    0.6414    0.4112   -0.6477

C:

    -0.3939    0.9010    0.1819
     0.6584    0.1385    0.7398
     0.6414    0.4112   -0.6477

Expl2:(交换了第 2 和第 3 列)

Matlab:

   -0.0309    0.1010    0.9944
   -0.0073   -0.9949    0.1008
    0.9995   -0.0042    0.0315

C:

   -0.0309    0.9944    0.1010
   -0.0074    0.1008   -0.9949
    0.9995    0.0315   -0.0042

Expl3:(相反的值)

Matlab:

   -0.1712   -0.8130   -0.5566
   -0.8861   -0.1199    0.4476
    0.4306   -0.5698    0.6999

C:

  -0.1712    0.8130    0.5566
  -0.8861    0.1199   -0.4477
   0.4307    0.5698   -0.6999

这种差异会导致错误的结果吗?

如果矩阵具有不同的奇异值,则其右奇异向量在乘以单位相位因子之前是唯一的。当考虑实奇异向量时,这归结为符号的变化(更多信息here)。

另外,由于奇异向量对应于一定的奇异值(Σ的对角线项),因此当奇异值在Σ对角线上的位置改变时,它们的顺序也可以改变。

这些更改是否会导致错误结果在很大程度上取决于您打算稍后在代码中使用正确的奇异向量做什么。