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 = 225000000 doubles at each 8 バイト: 1,800,000,000 バイトまたは 1.8GB

それがおそらくメモリが不足している理由です。

編集:

この質問この質問によると、C# のオブジェクトのサイズは 2GB を超えることはできません。1.8GB には、配列内の項目を参照するために必要な追加のオーバーヘッドはカウントされないため、すべてを考慮した場合、1.8GB は実際には 2GB を超える可能性があります (デバッグ情報がなければ何とも言えません。C# の経験が豊富な人は、これについて私をまっすぐに設定してください)。静的に割り当てられた配列は乱雑になる可能性があるため、非常に大きな配列を操作しようとしている場合は、この回避策を検討してください。

于 2013-07-16T15:02:33.397 に答える
0

covarianceMatrix を作成すると、15000*15000 = 225000000 のオブジェクトが作成されます。

したがって、1800000000 バイトのメモリが必要です。OutofMemoryException があるのはそのためです

于 2013-07-16T15:02:19.340 に答える