Слишком большое время работы для маленького цикла - C#
Формулировка задачи:
Я реализую алгоритм SURF.
Имеется уже заполненная матрица яркостей, где lockBitmap.Width и lockBitmap.Height - ширина и высота изображения в пикселях. Эта матрица заполняется быстро с помощью маршалинга.
И есть простенький код, который вычисляет интегральное представление изображения (матрица тех же размеров, где каждый элемент - сумма яркостей всех пикселей, левее и выше текущего):
Для изображения размером 50Х50 пикселей код работает шустро. Но для изображения 300Х300 требуется почти минута времени. С чем может быть связано такое большое время, если я просто гуляю по небольшому, уже заполненному массиву и просто беру из него числа?
double[,] BrightMatrix = new double[lockBitmap.Width, lockBitmap.Height];
for (int x = 0; x < lockBitmap.Width; x++) { for (int y = 0; y < lockBitmap.Height; y++) { double Sum = 0; for (int k = 0; k <= x; k++) { for (int l = 0; l <= y; l++) { Sum += BrightMatrix[k, l]; } } IntegralMatrix[x, y] = Sum; } }
Решение задачи: «Слишком большое время работы для маленького цикла»
textual
Листинг программы
for (int x = 0; x < source.Width; x++) { for (int y = 0; y < source.Height; y++) { if (x == 0 && y == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y]; } else if (y == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x - 1, y]; } else if (x == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x, y - 1]; } else { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x - 1, y] + IntegralMatrix[x, y - 1] - IntegralMatrix[x - 1, y - 1]; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д