如何有效地为20000*20000矩阵分配内存

how to effectively allocate memory for 20000*20000 matrix?

本文关键字:20000 分配 内存 有效地      更新时间:2023-10-16

我的代码遵循PCA算法,以找到一个20000 *35矩阵的特征向量和特征值。为了找到特征向量,我需要找到协方差矩阵,在计算中它是20000*20000的数量级。

我该如何处理这么大的矩阵呢?我使用OpenCV为我的代码

我认为你的问题可能是不正确的;如果你正在做PCA,你的20000 * 35矩阵很可能对35个变量有20000个观察值(对20000个变量有35个观察值不会有太大用处,所以我猜这不是你的情况)。

如果是这种情况,协方差矩阵的大小为35 × 35,而不是20k × 20k。

您可以使用QR算法,Jacobi方法或任何其他特征值/特征向量近似算法(许多是特定于实对称矩阵的,如协方差矩阵的情况)计算35x35矩阵的所有特征对。

20K * 20K = 400,000,000。如果使用32位浮点数,则为1.6 GB。这将是一个庞大的矩阵,但大多数现代计算机应该能够在没有特殊优化的情况下合理地处理它(这里的合理意味着不会花费一周的时间来处理)。如果你使用的是64位双精度系统,那么你就会看到3.2 GB的内存,这是越来越大了,但在现代计算机上仍然不是完全无法管理的。

如果你需要这段代码真正表现良好,那么考虑你的矩阵是否密集/稀疏。如果密度太大,你就无能为力了。如果它是稀疏的,你可能可以做一些优化。

编辑:另外,考虑使用OpenCL/CUDA进行优化。一般来说,涉及矩阵的问题通常具有高数据级并行性,并且适合GPU方法。