Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 03.05.2014
Сообщений: 47

Слишком большое время работы для маленького цикла

06.07.2016, 18:51. Показов 744. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я реализую алгоритм SURF.
Имеется уже заполненная матрица яркостей, где lockBitmap.Width и lockBitmap.Height - ширина и высота изображения в пикселях. Эта матрица заполняется быстро с помощью маршалинга.
C#
1
 double[,] BrightMatrix = new double[lockBitmap.Width, lockBitmap.Height];
И есть простенький код, который вычисляет интегральное представление изображения (матрица тех же размеров, где каждый элемент - сумма яркостей всех пикселей, левее и выше текущего):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 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;
                }
            }
Для изображения размером 50Х50 пикселей код работает шустро. Но для изображения 300Х300 требуется почти минута времени. С чем может быть связано такое большое время, если я просто гуляю по небольшому, уже заполненному массиву и просто беру из него числа?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2016, 18:51
Ответы с готовыми решениями:

Параллельное программирование - слишком большое ускорение
Если использовать параллельное программирование, при переходе от 1 потока к 2 потокам возможно ускорение максимум в 2 раза. А у меня при 2...

Ttfb время слишком большое
Здравствуйте. Кто-нибудь знает, почему ttfb время слишком большое? От чего это бывает и как исправить?

Время выполнения stored procedure слишком большое
Столкнулся здесь с такой проблемой. В некоторых случаях (примерно 30%) вызов довольно сложной сохраненной процедуры SQL Server'a 7 из...

4
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.07.2016, 19:07
И есть простенький код,
Omg, у вас 4 вложенных цикла, и вы удивляетесь, что оно тормозит?
Вся прелесть интегрального представления как раз в том, что для вычисления суммы пикселов вам не нужно бегать по всем пикселам. Это правило относится и к прцессу построения самого интегрального представления:
Code
1
I[i,j]=P[i,j]+I[i-1,j]+I[i,j-1]-I[i-1,j-1]
Где P[i,j] - значение пиксела.
0
0 / 0 / 1
Регистрация: 03.05.2014
Сообщений: 47
06.07.2016, 19:29  [ТС]
Storm23, да, я поняла Вашу мысль. Гораздо красивее будет сделать именно так.
Однако, не могли бы Вы показать, как эту формулу вставить в массив? Просто я не очень представляю, как использовать ее, например, для пикселя [0,0] (здесь же значение будет равно просто P[0,0] ) . В смысле я боюсь вылететь за границы массива.
Я понимаю лишь, что мы рассчитываем предварительные значения, а потом используем их.

Добавлено через 2 минуты
Storm23, в смысле такое решение
C#
1
2
3
4
5
6
7
 for (int x = 0; x < source.Width; x++)
            {
                for (int y = 0; y < source.Height; y++)
                {
                    IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x - 1, y] + IntegralMatrix[x, y - 1] - IntegralMatrix[x - 1, y - 1];
                }
            }
явно даст ошибку.

Добавлено через 5 минут
Storm23, я это к вопросу: нужно рассматривать кроме этого красивого общего случая несколько частных?

Добавлено через 6 минут
Storm23, вот такой код работает:
C#
1
2
3
4
5
6
7
8
9
10
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]; }
                }
            }
Большое спасибо за идею!!! Однако, как его можно оптимизировать?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
07.07.2016, 04:16
Цитата Сообщение от Sita RaiNy Посмотреть сообщение
Но для изображения 300Х300 требуется почти минута времени
1500 циклов CPU в секунду вполне нормальное время
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.07.2016, 06:51
Однако, как его можно оптимизировать?
Обычно, что бы избежать проблемы выхода за границы(которая кстати будет возникать и в дальнейшем, при вычислениях), интегральное изображение делается на один пиксел больше по ширине и высоте, чем исходное изображение.

Что касается оптимизации, см например исходники AForge
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2016, 06:51
Помогаю со студенческими работами здесь

Слишком большое время при получении данных через cUrl
Всем привет. :)Посмотрите пожалуйста код. &lt;?php header('content-type: text/html; charset=utf-8'); ?&gt; //русификация &lt;?php ...

За какое время сайт должен сообщить, что загружаемое фото слишком большое?
Привет всем. Такая ситуация: есть сайт и туда нужно загрузить фотографию, которая не более 2 Мб весит. И вот пользователь загружает...

Большое время работы
Добрый вечер, форумчане! Возникла проблема : у программы чтения файла очень большой runtime(пишу на codeblocks). Что с этим...

ОШИБКа слишком большое значение для знака
Ошибка на строке слишком большое значение для знака как исправить? if ((fp = fopen(&quot;C:\666.txt&quot;, &quot;a+&quot;)) == NULL)...

Слишком большое выражение для решения уравнения
Добрый день! Следующая проблема. Есть уравнение, которое решается аналитически, но matlab выдаёт ответ только в виде e1(z, p1, p2)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru