Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 稀疏矩阵的全奇异值分解库_C++_Sparse Matrix_Svd - Fatal编程技术网

C++ 稀疏矩阵的全奇异值分解库

C++ 稀疏矩阵的全奇异值分解库,c++,sparse-matrix,svd,C++,Sparse Matrix,Svd,我想对包含大量零的大型矩阵进行奇异值分解。特别是我需要U和S,从对称矩阵a的对角化中获得。这意味着a=U*S*转置(U^*),其中S是对角矩阵,U包含所有特征向量作为列 我在Web上搜索了将SVD和稀疏矩阵结合起来的C++库,但只能找到一些但不是所有特征向量的库。有人知道有没有这样的图书馆吗 同样,在获得U和S之后,我需要将它们乘以某个稠密向量。对于这个问题,我使用了不同技术的组合: Arpack可以计算一组特征值和相关的特征向量,不幸的是,它只适用于高频,而适用于低频 但是,由于矩阵逆矩阵的

我想对包含大量零的大型矩阵进行奇异值分解。特别是我需要U和S,从对称矩阵a的对角化中获得。这意味着a=U*S*转置(U^*),其中S是对角矩阵,U包含所有特征向量作为列

我在Web上搜索了将SVD和稀疏矩阵结合起来的C++库,但只能找到一些但不是所有特征向量的库。有人知道有没有这样的图书馆吗


同样,在获得U和S之后,我需要将它们乘以某个稠密向量。

对于这个问题,我使用了不同技术的组合:

  • Arpack可以计算一组特征值和相关的特征向量,不幸的是,它只适用于高频,而适用于低频

  • 但是,由于矩阵逆矩阵的特征向量与矩阵的特征向量相同,因此可以对矩阵进行因子分解(使用稀疏矩阵因子分解例程,如SuperLU,或者如果矩阵是对称的,则使用Choldmod)。带有Arpack的“通信协议”只要求您计算矩阵向量积,因此,如果您使用分解矩阵进行线性系统求解,则这将使Arpack在频谱低频段的速度更快(不要忘记用1/lambda替换特征值lambda!)

  • 此技巧可用于通过广义变换(前一点中的变换称为“反转”变换)探索整个光谱。还有一种“移位-反转”变换,允许人们探索频谱的任意部分,并具有Arpack的快速收敛性。然后计算(1/lambda+sigma)而不是lambda,当sigma是一个“移位”时(转换比“反转”转换稍微复杂一些,请参阅下面的参考文献以获得完整的解释)

ARPACK:

超级LU:

我的文章中解释了数值算法,可在此处下载:

源代码可从以下位置获得:

另见我对这个问题的回答:

p.S.也许这个问题应该转移到“科学计算”堆栈中?