我希望找到最快的代码/算法/包来获得真实的方形双对角矩阵的奇异值分解(SVD)。我正在使用的矩阵相当小 - 通常大约15x15。但是,我执行此SVD数千次(可能是数百万次),因此计算成本变得非常大。
我在C中编写了所有代码。我假设执行SVD的最快代码可能来自LAPACK。我一直在研究LAPACK,看起来我有很多不同的选项来执行真实的双对角矩阵的SVD:
dbdsqr
- 使用零移位QR算法获取双对角矩阵的SVD
dbdsdc
- 使用分而治之算法获取双对角矩阵的SVD
dgesvd
- 不确定这个是如何工作的,但它可以处理任意矩阵,所以我假设我更善于使用dbdsqr或dbdsdc
dgesdd
- 不确定这个是如何工作的,但它也可以处理任意矩阵,所以我假设我更善于使用dbdsqr或dbdsdc
dstemr
- 估算三对角矩阵的特征向量/特征值;我可以用它来通过找到A * A'的特征向量/值来估计左奇异向量/值;然后,我可以通过找到A'* A
dstemr
- 也许有更快的方式来使用dstemr来获取SVD ...如果你知道某种方式请告诉我
我不知道这些方法中哪一个最快。有没有更快的方法来获得我上面没有列出的真实双向对齐矩阵的SVD?
理想情况下,我正在寻找一个小的示例C代码来演示相对较小的真实双对角矩阵的最快SVD。