我有一个矩阵[3,15000]。我需要计算原始矩阵的协方差矩阵,然后找到其特征值。

这是我的代码的一部分:

double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];
for (int n=0; n<numberOfObjects;n++)
    {
    for (int m=0;m<numberOfObjects;m++)
    {
        double sum = 0;
        for (int k=0; k<TimeAndRepeats[i,1]; k++)
        {
            sum += originalMatrix[k,n]*originalMatrix[k,m];
        }
    covarianceMatrix[n,m] = sum/TimeAndRepeats[i,1];
    }
}
alglib.smatrixevd(covarianceMatrix,numberOfObjects,1,true,out eigenValues, out eigenVectors);


这里的NumberOfObjects大约是15000。
当我对较少数量的对象进行计算时,一切都很好,但是对于我的所有数据,我都会受到启发。
有可能解决这个问题吗?

我正在使用x64的macOS

我的环境是MonoDevelop

最佳答案

double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];


您说您的矩阵是[3,15000],而numberOfObjects是15000。通过此行代码,您将创建一个[double]的[15000,15000]矩阵

15000 * 15000 = 225000000分别以8个字节加倍:1,800,000,000字节或1.8GB

这可能就是为什么内存不足。

编辑:

根据this questionthis question,C#中的对象大小不能大于2GB。 1.8GB不计算引用数组中项目所需的任何额外开销,因此当考虑到所有内容后,1.8GB实际上可能大于2GB(不能说如果没有调试信息,具有C#经验的人可能不得不让我直接对此)。如果您尝试使用非常大的数组,则可能会考虑使用workaround,因为静态分配的数组可能会变得混乱。

10-07 19:34