3

我有一个矩阵 [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。当我对较少数量的对象进行计算时,一切都很好,但是对于我的所有数据,我得到了一个例外。有可能解决这个问题吗?

我正在使用 macOS,x64

我的环境是 MonoDevelop

4

3 回答 3

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

你说你的矩阵是 [3, 15000] 也numberOfObjects就是 15000。通过这里的这行代码,你正在创建一个双精度矩阵 [15000, 15000]

15000 * 15000 = 225000000 双倍,每个 8 字节:1,800,000,000 字节或 1.8GB

这可能就是你内存不足的原因。

编辑:

根据这个问题这个问题,C# 中对象的大小不能大于 2GB。1.8GB 不计算引用数组中的项目所需的任何额外开销,因此当考虑到所有内容时,1.8GB 实际上可能 > 2GB(不能说没有调试信息,具有更多 C# 经验的人可能不得不让我明白这一点)。如果您尝试使用非常大的数组,您可能会考虑这种解决方法,因为静态分配的数组可能会变得混乱。

于 2013-07-16T15:02:33.397 回答
0

当您创建协方差矩阵时,您正在创建一个 15000*15000 = 225000000 的对象

所以你需要 1800000000 字节的内存。正因为如此,你有 OutofMemoryException

于 2013-07-16T15:02:19.340 回答
0

异常名称可以准确地告诉您问题所在。您可以使用浮点数而不是双精度数来平分所需的内存量。其他选择是为协方差矩阵创建一些类对象,将数据保存在磁盘文件中,尽管您需要实施适当的机制来对其进行操作,并且性能也会受到限制。

于 2013-07-16T15:38:16.800 回答