| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Не работает обращение больших матриц |
| Автор: hello19 21.7.2011, 18:43 | ||
| Есть матрица порядка 3638. Мне нужно найти обратную к ней. ( В последствии порядок матрицы будет около 100 000) Есть код, вот только он не совсем рабочий. На маленьких матрицах порядка 3-4 он работает отлично, а вот на матрице порядка 3638 - не работает. В качестве результата выдает исходную матрицу. Помогите найти косяк. И по возможности сделать код "по-шустрее"
Сами матрицы находятся в текстовых файлах. Прикрепил и их: 1.txt - матрица порядка 4 (пробная) 2.txt - сюда записывается результат работы программы 3.txt - матрица порядка 3638 |
| Автор: Сыроежка 21.7.2011, 20:07 |
| Я вам уже на другом форуме ответил, что мне не понятно следующее (цитирую по другому форуму): template <typename T> void SetMtx(T **matr, int n); double **matr = new double * [n]; SetMtx(matr, n); Я уже в этих строчках вижу "косяк". Вопрос к вам, чему у вас равен тип T, когда вы вызываете SetMtx(matr, n);?! Точнее говоря, какой тип у параметра matr в результате инстанциации вашей функции для аргумента matr?! |
| Автор: borisbn 21.7.2011, 22:30 | ||||
так легко ж проверить
http://liveworkspace.org/code/9195f30a7f23cd50a48c9092323daecf меня смущает другое: т.е. у тебя будет матрица 100 000 x 100 000 дублей ??? посчитай, сколько это будет занимать памяти... я уже подсчитал - 10 000 000 000 * sizeof( double ) = 80 000 000 000 = 80 ГБт. а ты выделяешь 4 таких массива
это 320 ГБт памяти.... я не знаю, какое у тебя "железо", но сдаётся мне, что 320 ГБт у тебя не будет... мож я, конечно, и ошибаюсь, но IMHO сама постановка (да и реализация) задачи - неправильная. Think 'bout it |
| Автор: bsa 21.7.2011, 23:13 |
| В свое время мне один математик (кандидат наук) рассказал, что чем больше размерность матриц, тем выше требования к точности операций (читай к количеству значащих разрядов в числе). Другими словами, чтобы результаты умножения и обращения матриц таких размеров были адекватны, необходимо оперировать с числами ЗНАЧИТЕЛЬНО большей точности, чем даже long double. |
| Автор: hello19 22.7.2011, 09:44 |
| Как же тогда найти обратную матрицу для матрицы такого порядка? Для меня главное скорость, а что же касается ресурсо, то их хватит и на работу вышеуказанного кода. |
| Автор: bsa 22.7.2011, 10:08 |
| hello19, смотри в сторону рациональных чисел с бесконечной точностью. Но тут уже 320 ГБ оперативной памяти не отделаешься. Кстати, у меня есть большие сомнения, что твой код в том виде, в котором он нам представлен, вообще будет адекватно работать на машинах с достаточным количеством ресурсов (если не секрет, как называется супер компьютер, к которому у тебя есть доступ?) - там используются совсем другие принципы построения программ (так как фактически они имеют не один мощный процессор с гигантским объемом ОЗУ, а тысячи обычных процессоров каждый со своей памятью обычного объема). |
| Автор: Silent 22.7.2011, 11:58 | ||
Сидел, обедал, читал любимый форум...
а потом чуть не подавился О_О иметь возможность запихнуть в ОЗУ 320Гб данных и писать такой код? уважаемый hello19, задачи матричной алгебры появились не вчера и не позавчера, их решали еще в бородатые годы, и есть же наработки, что мешает их посмотреть? Чтобы не быть голословным, пример: середина 60х, вычислительная машина М-20 (аж 20 000 операций в секунду!, 300 слов оперативной памяти!, аще круть) - и решали СЛАУ практически любого порядка (200го - за 9 минут). |
| Автор: bsa 22.7.2011, 13:02 | ||
|
| Автор: newbieone 22.7.2011, 13:10 |
так программисты, сдается мне, хорошо знали курс численного решения математических задач, разделы по СЛАУ, основные теоремы (LU-разложение, формы представления)... |
| Автор: Фантом 24.7.2011, 13:55 |
Это один сплошной косяк, который надо выкинуть и начать все сначала. Почитайте хотя бы Википедию, даже там можно найти описания методов обращения матриц с указанием сложности соответствующих алгоритмов. P.S. И "шедевры" вроде if(det) уберите. |
| Автор: alexvs11 24.7.2011, 14:12 |
| надо сказать вычисление одного детерминанта зависнит надолго при таких размерностях |
| Автор: bsa 24.7.2011, 16:59 | ||
А без рекурсии его реализация проблематична (без использования LU-разложения). |