我的代码遵循 PCA 算法,以找到 20000 *35 矩阵的特征向量和特征值。因此,为了找到特征向量,我需要找到协方差矩阵,其计算量级为 20000*20000。
我将如何处理如此庞大的矩阵?我正在为我的代码使用 OpenCV
我相信您的问题可能不正确;如果您正在做 PCA,您的 20000 * 35 矩阵很可能对 35 个变量有 20000 个观察值(对 20000 个变量进行 35 个观察值不会有多大用处,所以我猜这不是您的情况)。
如果是这种情况,协方差矩阵的大小为 35 x 35,而不是 20k x 20k。
您可以使用 QR 算法、Jacobi 方法或任何其他特征值/特征向量近似算法计算 35x35 矩阵的所有特征对(许多特定于实对称矩阵,如协方差矩阵的情况)。
20K * 20K = 400,000,000。如果您使用 32 位浮点数,则为 1.6 GB。这将是一个矩阵的野兽,但大多数现代计算机应该能够在没有特殊优化的情况下合理地处理它(这里合理地意味着它不需要一周的时间来处理)。如果您使用的是 64 位双打,那么您看到的是 3.2 GB,它变得越来越密集,但在现代计算机上仍然不是完全无法管理的。
如果您需要此代码真正表现良好,请考虑您的矩阵是否密集/稀疏。如果它很密集,那么您无能为力。如果它很稀疏,您可能可以进行一些优化。
编辑:另外,考虑使用 OpenCL/CUDA 进行优化。一般来说,涉及矩阵的问题通常具有较高的数据级并行性,并且适用于 GPU 方法。