有谁知道Matlab函数产生的奇异向量的符号svd是如何确定的?
让:
B = U*S*V'
svd是实数或复数 2×2 矩阵 B 的有效分解,则:
B = (U*c)*S *(V*c)'
也是有效的,其中c是一个改变一个或两个奇异向量符号的矩阵:
c = diag([1 -1]), diag([-1 1]) or diag([-1 -1])。
我想知道Matlab的svd算法如何确定U和V中奇异向量的符号。
Matlab 使用 LAPACK 的 DGESVD 实现进行奇异值分解,该实现不考虑结果向量的方向。在应用中,执行 SVD 时,先处理分解的数据,然后重构数据,后向符号没有区别。仅当分析分解的数据时,它们才变得重要。
使用 Matlab 执行 SVD 后,可以应用符号校正算法。但我相信符号校正取决于数据的实际含义。
在您提供的论文中,选择的方向与大多数数据点相同。这不适用于对称分布的数据,因为理论方向为零并且样本方向是随机的,导致数值高度不稳定。
如果目标只是获得解的数值稳定性,那么选择某个向量并将所有 SVD 向量更改为与其位于同一半空间中就足够了。