c++ - 计算 3x3 对称矩阵谱分解的快速方法

标签 c++ algorithm optimization cuda linear-algebra

我正在从事一个项目,我基本上在 20-100 个点的集合上执行 PCA 数百万次。目前,我们正在使用一些遗留代码,这些代码使用 GNU 的 GSL 线性代数包在协方差矩阵上执行 SVD。这有效,但速度很慢。

我想知道是否有任何简单的方法可以对 3x3 对称矩阵进行特征分解,这样我就可以将其放在 GPU 上并让它并行运行。

由于矩阵本身很小,我不确定使用哪种算法,因为它们似乎是为大型矩阵或数据集设计的。也可以选择对数据集进行直接 SVD,但我不确定什么是最佳选择。

我不得不承认,我在线性代数方面并不出色,尤其是在考虑算法优势时。任何帮助将不胜感激。

(我现在在用 C++ 工作)

最佳答案

使用特征多项式可行,但它在数值上往往有些不稳定(或者至少不准确)。

计算对称矩阵的特征系统的标准算法是 QR 方法。对于 3x3 矩阵,通过从旋转构建正交变换并将它们表示为四元数,可以实现非常巧妙的实现。假设您有一个 3x3 矩阵和一个四元数类,可以在 C++ 中找到这个想法的(相当短!)实现 here .该算法应该非常适合 GPU 实现,因为它是迭代的(因此是 self 校正的),可以合理地利用可用的快速低维 vector 数学原语,并且使用相当少的 vector 寄存器(因此它允许更多的事件线程)。

关于c++ - 计算 3x3 对称矩阵谱分解的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372224/

相关文章:

c++ - 从模板类继承: "member" was not declared at this scope

algorithm - 寻找算法的 Θ

algorithm - 这个搜索算法是最优的吗?

algorithm - 优化 Modbus 请求

c++ - 编译器生成的赋值运算符不安全吗?

c++ - 如何在c++中从一行中的两个文件(水平)中打印数据?如给定的。这两种形式来自两个不同的文本文件

performance - super 丑数

optimization - 为什么我们使用中间语言而不是AST?

c++ - i = v.end() 可以从 for 循环中优化吗?

c++ - 解决我的代码中未通过测试用例的错误