0

これは、255X255の行列を作成するための簡単なプログラムです。内部のロジックは単純ですが、これをc#で実行している間は、多くの時間(約25分)がかかります。私は問題を理解することができません。助けてください。

int height = croppedArray.GetLength(1);
int width = croppedArray.GetLength(0);
for (int i = 0; i <= 255; i++)
{
    for (int j = 0; j <= 255; j++)
    {
        A = 0;
        for (int n = 0; n < height ; n++)
        {
            for (int m = 0; m <width-1; m++)
            {
                int fmn = croppedArray[m, n];

                int fmxn = croppedArray[m+1,n];

                if (fmn == i && fmxn == j)
                    A++;


            }
        }

        q_zero[i, j] = A;

    }
} 
return q_zero;
4

2 に答える 2

2

ロジックの「複雑さ」が原因で CPU 時間がかかることはめったにありません。測定可能な CPU 時間を使用するのに十分なほど複雑なロジックを作成することは、非常に困難です。コードを実際に遅くするのはループです。この場合の内部ループのロジックの複雑さは、256x256 行列の各要素 (つまり、65,536 回) のすべての要素を調べているため、無関係ですcroppedArray。各要素を見るのはかなり簡単ですが、64,000 回実行しています!

幸いなことに、必要なループが 2 つだけの場合、ネストされたループが 4 つあるようq_zeroですq_zero。2D マトリックスを 1 回反復するだけで、適切な要素q_zeroが表示されたときにインクリメントされます。

代わりにこれはどうですか:

int height = croppedArray.GetLength(1);
int width = croppedArray.GetLength(0);

for (int n = 0; n < height; n++)
{
    for (int m = 0; m < width - 1; m++)
    {
        int fmn = croppedArray[m, n];
        int fmxn = croppedArray[m+1,n];

        if (fmn >= 0 && fmn <= 255 && fmxn >= 0 && fmxn <= 255)
            q_zero[fmn, fmxn]++;
    }
}

return q_zero;
于 2012-06-11T10:44:17.440 に答える
0

i、j ループは不要です。次のコードは同等であり、パフォーマンスが大幅に向上するはずです。

        int height = croppedArray.GetLength(1); 
        int width = croppedArray.GetLength(0); 
        for (int n = 0; n < height ; n++) 
        { 
             for (int m = 0; m <width-1; m++) 
             { 
                int i= croppedArray[m, n]; 
                int j = croppedArray[m+1,n]; 

                if (i >= 0 && i <=255 && j >=0 && j <= 255) 
                {
                    q_zero[i, j]++; 
                } 
            } 
        }  
        return q_zero; 
于 2012-06-11T10:44:14.427 に答える