0

这是一个制作 255 X 255 矩阵的简单程序。里面的逻辑很简单,但是在 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. 尽管查看每个元素相当简单,但您却做了 64k 次!

幸运的是,当您只需要 2 个时,看起来您有 4 个嵌套循环。与其为 的每个元素迭代整个 2D 矩阵一次q_zero,您可以将q_zero其用作一大堆累加器。只需遍历 2D 矩阵一次,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 回答