我正在尝试将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
这种差异会导致错误的结果吗?
答案 0 :(得分:1)
如果矩阵具有明显的奇异值,则矩阵的右奇异向量是唯一的乘以单位相位因子。在考虑实际奇异向量时,这归结为符号的变化(更多信息here)。
此外,由于奇异向量对应于某些奇异值(Σ的对角线条目),当Σ对角线上奇异值的位置发生变化时,它们的阶数可以改变。
这些更改是否会导致错误的结果在很大程度上取决于您在代码中稍后要使用正确的奇异向量。