| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Блочный метод гауса. |
| Автор: Nookie 28.10.2007, 15:48 |
| Это не обычный мтод гауса, а блочный, когда рассмариваются элементы не как числа а как матрици заданного размера. прикрепил файл, там мой отчет. Этот метод должен давать выйгриш в скорости в 6-7 раз по сравнению с обычным метдом гауса. Я написал на С++, решает, но вот толго, для больших размеров вйгрыш всего на 5 секунд... может кто подскажет как улучшить? |
| Автор: Akina 28.10.2007, 15:55 |
| Это ж как надо собою гордиться, чтобы ТАКОЕ количество ошибок наляпать? |
| Автор: Nookie 28.10.2007, 17:50 |
| Я могу скинуть программу, но будет ли там что понятно для вас. Он должен работать быстрее... Обратную матрицу я ищу по методу: не помню как он называет, но делаю так.. записываю две матрици подряд, первую привожу к единичной, а вторая тоже изменияется.. справа получается обратная матрица, по мойму метод лапласса, точно это метод Гаусса... (как-то криво написал) Насчет выйгрыша времени, нам это наш препод рассазал, думаю верить ему можно... Я протестировал программу, обратную матрицу он ищет не так долго... там мелочи, подсчитал все время, которое он считает обратные матрицы, просуммировал... получилось всего 0,5-1 секунда, с матрицей 2000*2000 и размером блока на 50*50. Больше всего занимает времени это умножение и отнятие строк.... самое интересное, ребята делают программы, которые рещают матрице 2000*2000 за 6 секунд, а у меня за 38 секунд..................... А насчет ошибок думаю это не важно. |
| Автор: marcusmae 28.10.2007, 18:21 | ||||
Ага, прямым методом, значит. Хорошо.
Лучше, конечно, иметь дело с книжками и оценками на число умножений, зависящими от размеров матрицы. Скажем, обычный метод Гаусса - порядка n^3 / 3 (это очень много).
Я решал за это время слау с размерностями в пару десятков тысяч. Естественно, не методом Гаусса, и не очень плотные матрицы (много нулей). Ну хоть бы какие-нибудь детали показали бы. У Вас там, должно быть, какой-то формат есть? Вряд ли хороша идея иметь один большой двумерный массив для матрицы и постоянно считать отступы для добора до нужных блоков. Наверно, вы храните двумерный массив блоков или что-то такое? Вычитание делаете в позиции или кладёте результат на новое место? И вообще, все эти операции собственного производства или какой-то готовый BLAS используете? |
| Автор: Nookie 29.10.2007, 01:18 | ||||
| Попытаюсь на все ответить. Масив такой
например, размер блока SizeBlock, чтобы обратиться к i, j блоку делаю так
В результате перехожу в i, j блок и в этом блоке в k, l элемент этого блока... вычитая сразу кладу в матрицу, то есть посчитал элемент умноженияи в том же цикле положил результат. Препод сам написал книжки, Богачев К.Ю., называется решение линейных систем, но там про блочный метод ничего не написано, там рассказывается обычные методы. вот. если вам надо, миогу эту книгу дать в электронном виде. Он же у нас ведет практикум по ЭВМ. Если хотите, могу скинуть программу, только на мыло. Не хочу в общак. Спасибо. Добавлено через 2 минуты и 28 секунд >вычитая сразу кладу в матрицу, то есть посчитал элемент умноженияи в том же цикле положил результат. результат разности.... в смысле отнял |
| Автор: marcusmae 29.10.2007, 23:42 | ||||||
Хм, ну вот, я бы воздержался от расчёта означенного выражения для каждого элемента блока - целых два умножения. Предлагаю хранить так : 1) двумерный массив указателей на блоки 2) каждый блок = массив элементов блока Плюс один момент : когда вам нужно перейти к следующему элементу строки или столбца, берите не индексы, а инкрементируйте указатель на текущий элемент на единицу, или, соответственно, на длину строки (сумма дешевле умножений). Я бы организовал вычитание как-то так :
А можно на Ваше посмотреть? |
| Автор: Nookie 30.10.2007, 19:10 |
| Схожу завтра на пару, спрошу у препода, потом напишу в чем все таки дело.... |
| Автор: Nookie 15.11.2007, 14:10 |
| Короче я сдал эту задачу, сЩитает очень хорошо, за 6.80 секунд... просто надо было оптимизировать и кое-что поправит. Спасибо за помощь. Если надо могу кому-нибудь скинут программу. |