C++ 稀疏矩阵的全奇异值分解库
我想对包含大量零的大型矩阵进行奇异值分解。特别是我需要U和S,从对称矩阵a的对角化中获得。这意味着a=U*S*转置(U^*),其中S是对角矩阵,U包含所有特征向量作为列C++ 稀疏矩阵的全奇异值分解库,c++,sparse-matrix,svd,C++,Sparse Matrix,Svd,我想对包含大量零的大型矩阵进行奇异值分解。特别是我需要U和S,从对称矩阵a的对角化中获得。这意味着a=U*S*转置(U^*),其中S是对角矩阵,U包含所有特征向量作为列 我在Web上搜索了将SVD和稀疏矩阵结合起来的C++库,但只能找到一些但不是所有特征向量的库。有人知道有没有这样的图书馆吗 同样,在获得U和S之后,我需要将它们乘以某个稠密向量。对于这个问题,我使用了不同技术的组合: Arpack可以计算一组特征值和相关的特征向量,不幸的是,它只适用于高频,而适用于低频 但是,由于矩阵逆矩阵的
我在Web上搜索了将SVD和稀疏矩阵结合起来的C++库,但只能找到一些但不是所有特征向量的库。有人知道有没有这样的图书馆吗
同样,在获得U和S之后,我需要将它们乘以某个稠密向量。对于这个问题,我使用了不同技术的组合:
- Arpack可以计算一组特征值和相关的特征向量,不幸的是,它只适用于高频,而适用于低频
- 但是,由于矩阵逆矩阵的特征向量与矩阵的特征向量相同,因此可以对矩阵进行因子分解(使用稀疏矩阵因子分解例程,如SuperLU,或者如果矩阵是对称的,则使用Choldmod)。带有Arpack的“通信协议”只要求您计算矩阵向量积,因此,如果您使用分解矩阵进行线性系统求解,则这将使Arpack在频谱低频段的速度更快(不要忘记用1/lambda替换特征值lambda!)
- 此技巧可用于通过广义变换(前一点中的变换称为“反转”变换)探索整个光谱。还有一种“移位-反转”变换,允许人们探索频谱的任意部分,并具有Arpack的快速收敛性。然后计算(1/lambda+sigma)而不是lambda,当sigma是一个“移位”时(转换比“反转”转换稍微复杂一些,请参阅下面的参考文献以获得完整的解释)
p.S.也许这个问题应该转移到“科学计算”堆栈中?