Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блочный метод гауса. Решение линейной системы. 
V
    Опции темы
Nookie
Дата 28.10.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.7.2005
Где: Россия, Москва

Репутация: нет
Всего: нет



Это не обычный мтод гауса, а блочный, когда рассмариваются элементы не как числа а как матрици заданного размера.
прикрепил файл, там мой отчет.
Этот метод должен давать выйгриш в скорости в 6-7 раз по сравнению с обычным метдом гауса.
Я написал на С++, решает, но вот толго, для больших размеров вйгрыш всего на 5 секунд...
может кто подскажет как улучшить?

Присоединённый файл ( Кол-во скачиваний: 52 )
Присоединённый файл  a.pdf 78,56 Kb
--------------------
Хочу знать все!!!
PM MAIL ICQ Skype   Вверх
Akina
Дата 28.10.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Это ж как надо собою гордиться, чтобы ТАКОЕ количество ошибок наляпать?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
marcusmae
Дата 28.10.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Nookie, 

1) раз у Вас блочный метод Гаусса (кажется, ещё и с выбором ведущего элемента), то нужно искать обратные матрицы к тем блокам, на которые Вы делите большую матрицу. Как Вы ищите обратные матрицы?

2) 
Цитата(Nookie @  28.10.2007,  15:48 Найти цитируемый пост)
Этот метод должен давать выйгриш в скорости в 6-7 раз по сравнению с обычным метдом гауса.

что-то сомневаюсь. А откуда ввобще такие числа и почему нет зависимости от размерности матрицы?

В любом случае, надо программу смотреть, а то так непонятно, что улучшать.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Nookie
Дата 28.10.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.7.2005
Где: Россия, Москва

Репутация: нет
Всего: нет



Я могу скинуть программу, но будет ли там что понятно для вас.
Он должен работать быстрее...

Обратную матрицу я ищу по методу:
не помню как он называет, но делаю так..
записываю две матрици подряд, первую привожу к единичной, а вторая тоже изменияется.. справа получается обратная матрица, по мойму метод лапласса, точно это метод Гаусса... (как-то криво написал)

Насчет выйгрыша времени, нам это наш препод рассазал, думаю верить ему можно... 
Я протестировал программу, обратную матрицу он ищет не так долго... там мелочи, подсчитал все время, которое он считает обратные матрицы, просуммировал... получилось всего 0,5-1 секунда, с матрицей 2000*2000 и размером блока на 50*50.
Больше всего занимает времени это умножение и отнятие строк....

самое интересное, ребята делают программы, которые рещают матрице 2000*2000 за 6 секунд, а у меня за 38 секунд.....................



А насчет ошибок думаю это не важно.
--------------------
Хочу знать все!!!
PM MAIL ICQ Skype   Вверх
marcusmae
Дата 28.10.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Цитата(Nookie @  28.10.2007,  17:50 Найти цитируемый пост)
Обратную матрицу я ищу по методу:

Ага, прямым методом, значит. Хорошо.

Цитата(Nookie @  28.10.2007,  17:50 Найти цитируемый пост)
Насчет выйгрыша времени, нам это наш препод рассазал, думаю верить ему можно... 

Лучше, конечно, иметь дело с книжками и оценками на число умножений, зависящими от размеров матрицы. Скажем, обычный метод Гаусса - порядка n^3 / 3 (это очень много).

Цитата(Nookie @  28.10.2007,  17:50 Найти цитируемый пост)
самое интересное, ребята делают программы, которые рещают матрице 2000*2000 за 6 секунд, а у меня за 38 секунд

Я решал за это время слау с размерностями в пару десятков тысяч. Естественно, не методом Гаусса, и не очень плотные матрицы (много нулей).

Цитата(Nookie @  28.10.2007,  17:50 Найти цитируемый пост)
Я могу скинуть программу, но будет ли там что понятно для вас.

Ну хоть бы какие-нибудь детали показали бы.

У Вас там, должно быть, какой-то формат есть? Вряд ли хороша идея иметь один большой двумерный массив для матрицы и постоянно считать отступы для добора до нужных блоков. Наверно, вы храните двумерный массив блоков или что-то такое?

Цитата(Nookie @  28.10.2007,  17:50 Найти цитируемый пост)
Больше всего занимает времени это умножение и отнятие строк....

Вычитание делаете в позиции или кладёте результат на новое место? И вообще, все эти операции собственного производства или какой-то готовый BLAS используете?



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Nookie
Дата 29.10.2007, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.7.2005
Где: Россия, Москва

Репутация: нет
Всего: нет



Попытаюсь на все ответить.
Масив такой

Код

double *Matr;

Matr=(double*)malloc(Size*Size*sizeof(double));


например, размер блока SizeBlock, чтобы обратиться к i, j блоку делаю так

Код

Matr[(i * SizeBlock + k) + j * SizeBlcok + l]


В результате перехожу в i, j блок и в этом блоке в k, l элемент этого блока...

вычитая сразу кладу в матрицу, то есть посчитал элемент умноженияи в том же цикле положил результат.

Препод сам написал книжки, Богачев К.Ю., называется решение линейных систем, но там про блочный метод ничего не написано, там рассказывается обычные методы. вот. если вам надо, миогу эту книгу дать в электронном виде.
Он же у нас ведет практикум по ЭВМ.

Если хотите, могу скинуть программу, только на мыло. Не хочу в общак.
Спасибо.

Добавлено через 2 минуты и 28 секунд
>вычитая сразу кладу в матрицу, то есть посчитал элемент умноженияи в том же цикле положил результат.
результат разности.... в смысле отнял
--------------------
Хочу знать все!!!
PM MAIL ICQ Skype   Вверх
marcusmae
Дата 29.10.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Цитата(Nookie @  29.10.2007,  01:18 Найти цитируемый пост)
например, размер блока SizeBlock, чтобы обратиться к i, j блоку делаю таккод
Код

Matr[(i * SizeBlock + k) + j * SizeBlcok + l]

В результате перехожу в i, j блок и в этом блоке в k, l элемент этого блока...


Хм, ну вот, я бы воздержался от расчёта означенного выражения для каждого элемента блока - целых два умножения.

Предлагаю хранить так :
1) двумерный массив указателей на блоки
2) каждый блок = массив элементов блока

Плюс один момент : когда вам нужно перейти к следующему элементу строки или столбца, берите не индексы, а инкрементируйте указатель на текущий элемент на единицу, или, соответственно, на длину строки (сумма дешевле умножений).
Я бы организовал вычитание как-то так :

Код

// A1 = A1 - A2.
inline double* inposMatSubstract(const int m, const int n, double* matrix1, const double* matrix2) {

double* currMatrix1 = matrix1;
double* currMatrix2 = matrix2;
for (int elemIndex = 0; elemIndex < m * n; elemIndex++)
{
    *currMatrix1 -= *currMatrix2;
    currMatrix1++; currMatrix2++;
}

return matrix1;

}



А можно на Ваше посмотреть?

Это сообщение отредактировал(а) marcusmae - 29.10.2007, 23:51


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Nookie
Дата 30.10.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.7.2005
Где: Россия, Москва

Репутация: нет
Всего: нет



Схожу завтра на пару, спрошу у препода, потом напишу в чем все таки дело....
--------------------
Хочу знать все!!!
PM MAIL ICQ Skype   Вверх
Nookie
Дата 15.11.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.7.2005
Где: Россия, Москва

Репутация: нет
Всего: нет



Короче я сдал эту задачу, сЩитает очень хорошо, за 6.80 секунд... просто надо было оптимизировать и кое-что поправит.
Спасибо за помощь.
Если надо могу кому-нибудь скинут программу.
--------------------
Хочу знать все!!!
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.