我过去几周一直在尝试在C中实施SVD,目前我一直在使用找到here的算法6,根据我的理解,此算法将在时间O(n ^ 5),因为有两个循环(其中一个循环不会从0变为n,我知道但是n ^ 5作为粗略界限),并且在内部循环矩阵内部必须进行乘法运算是一个n ^ 3过程。
然而,根据this website,对于n×n矩阵,SVD可以用O(2n ^ 3)计算。有谁知道我在哪里可以找到那个时间复杂度的算法?
答案 0 :(得分:6)
如果有人在将来寻找答案,如果矩阵是方阵,则在O(n ^ 3)中计算SVD的算法是Jacobi Rotations的方法。
有关特定算法的更多信息,请参阅this website上的算法7。
由于拼写错误,网站上的符号有点令人困惑,但是在确定d1,d2,c和č的值的步骤中(抱歉,这是我最接近c的帽子在顶部),他们的意思是c = cos(theta),s = sin(theta),č= cos(phi)和š= sin(phi)。
您可以通过消除和替换来计算theta和phi的这些值,或者您可以查看this StackExchange post以了解如何计算它们。
之后就是遵循该算法。