基于SVD实现计算酉矩阵的行列式

计算科学 Python scipy 麻木的 svd 行列式
2021-12-20 16:00:48

我有一个真正的方阵X我需要对其执行奇异值分解。现在,执行操作

X=USVT

作为UV是正交的,我们知道det(X)=±det(S)并且是非负的,因为奇异值是非负的。det(S)

现在,我需要知道行列式的符号(当然,这与知道行列式相同)。然而,天真的方法花费了我UV2O(N3)

我想知道是否有人知道一种方法

  1. 的行列式的符号推断为SVD 实现或 Python 中的类似库的双积,而无需调用and UVnumpyscipydet(U)det(V)
  2. det(U)基于是正交的事实,计算比 的默认实现更快的正交矩阵的行列式。U/V

PS:关于 Stack Overflow 的先前问题

2个回答

如果您准备在 fortran 代码中进行挖掘:

SVD算法由几个部分组成:

  1. 双对角化(通常使用 Householder 反射器)
  2. 使用 QR 移位将双对角线减少为对角线(通常使用 Givens 旋转)
  3. 更改任何负对角线元素的符号并对奇异值重新排序,使其递减。

符号说明,我将 SVD 写为A=USVT

反射器通常具有行列式 -1,因此应用一个将改变行列式的符号。一个小细节,LAPACK 有时会“作弊”并使用微不足道的旋转而不是反射器,这是如果特定列已经减少了。要在第一步之后计算行列式,只需计算的非平凡反射器的数量。如果有个非平凡反射器,则行列式是UVk(1)k

旋转具有行列式 1,因此应用一个不会改变行列式的符号。因此,我们不需要考虑步骤 2 中的计算。

中的对应列乘以-1这也再次行列式的符号。因此,与反射器类似,我们需要计算符号变化的数量才能使行列式达到这一点。V1V

要重新排序奇异值,我们还需要重新排序,每次交换都会改变行列式的符号。同样,我们计算掉期的数量。UV

我可能错过了一些细节,我对特征值求解器比专门的 svd 程序更熟悉。

第 1 部分:据我所知,答案是否定的。

对于第 2 部分:这个问题有几个很好的答案,所有答案都是否定的(实际上没有更快的方法)。我不相信有关于这个话题的有意义的新文献。