我有一个矩阵[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
答案 0 :(得分:4)
double[,] covarianceMatrix = new double[numberOfObjects,numberOfObjects];
你说你的矩阵是[3,15000]而且numberOfObjects
是15000.通过这行代码,你创建了一个[15000,15000]双精度矩阵
15000 * 15000 = 225000000双倍,每个8字节:1,800,000,000字节或1.8GB
这可能是你内存不足的原因。
修改强>
根据this question和this question,C#中对象的大小不能大于2GB。 1.8GB不计算引用阵列中的项目所需的任何额外开销,因此1.8GB可能实际上是>当所有内容都被计算在内时2GB(如果没有调试信息,那么拥有更多C#经验的人可能不得不让我直截了当)。如果您尝试使用非常大的数组,可以考虑这个workaround,因为静态分配的数组可能会变得混乱。
答案 1 :(得分:0)
创建协方差矩阵时,您创建的对象为15000 * 15000 = 225000000
所以你需要1800000000字节的内存。正是因为你有OutofMemoryException
答案 2 :(得分:0)
异常名称告诉您究竟是什么问题。您可以使用浮动而不是双打来平分所需的内存量。其他选项是为协方差矩阵创建一些类对象,以便将数据保存在磁盘文件中,尽管您需要实现适当的机制来对其进行操作,并且性能也会受到限制。