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

时间:2013-05-04 16:53:25

标签: c++ c opencv

我的代码遵循PCA算法,以便找到20000 * 35矩阵的特征向量和特征值。因此,为了找到特征向量,我需要找到协方差矩阵,其在计算时将是20000 * 20000的量级。

我将如何处理如此巨大的矩阵?我正在使用OpenCV代码

2 个答案:

答案 0 :(得分:3)

我相信你的问题可能是形成的;如果您正在进行PCA,那么您的20000 * 35矩阵最有可能在35个变量上有20000个观测值(对200个变量进行35次观测并没有多大用处,所以我猜这不是你的情况)。

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

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

答案 1 :(得分:2)

20K * 20K = 400,000,000。如果您使用的是32位浮点数,则为1.6 GB。它将是一个矩阵的野兽,但大多数现代计算机应该能够合理地处理(合理地说这意味着它不需要花费一周时间来处理)而无需特殊优化。如果您使用的是64位双打,那么您将看到3.2 GB,这种情况越来越激烈,但在现代计算机上仍然无法完全无法管理。

如果您需要此代码才能真正表现良好,请考虑您的矩阵是否密集/稀疏。如果它很密集,你可以做的并不多。如果它很稀疏,可能会进行一些优化。

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