![]() |
|
Модераторы: bsa |
![]()
|
|
| wolver17 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: нет Всего: 1 |
Значит, собственно нужно найти определитель любой квадратной матрицы. Нашёл в Инете код, работает для любой матрицы, хоть 3*3 хоть 10*10, но он на pascal'e...
Переделал в cpp и переделал в динамич. массивы - в итоге считает только для 3*3, 4*4, если выше брать размерность матрицы, начинаются глюки в рекурсивно высчитываемых минорах, не могу разобраться где исправить, чтобы заработало так же прекрасно как и на pascal((( Помогите пожалуйста! Ниже привожу исходник на pascal и мой cpp-код:
|
||||
|
|||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Я бы сказал так - метод, который O(n!), и не должен применяться для матриц больше 4x4 Что бы не воспользоваться обычным простым O(n^3) методом?... Скажу честно - не разбирался с вашим кодом, но сразу видно, что с памятью у вас (в смысле, у программы Например, вы удаляете a[i], но не удаляете выделенную память в a, удаляете в main память, выделенную для b[i], но нигде ее не выделяете (в Determinant не в счет, там b - локальная переменная, и, кстати, память там не освобождается... Все же, если задача - просто найти определитель, а не именно таким способом - посмотрите в сторону приведения матрицы к треугольному виду... Это сообщение отредактировал(а) disputant - 6.4.2012, 19:44 |
|||
|
||||
| wolver17 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: нет Всего: 1 |
затем, что мне в проекте надо считать до 10*10 матрицы. и чем вам не угождает больше 3*3? переполнения дин. памяти там нету. и на паскале ж работает любой размер, чем вдруг с++ хуже? Добавлено @ 19:55 [QUOTE=disputant,6.4.2012, 19:37]
разве я не правильно освобождаю память в delete для двумерн. массива? насчёт b[i] - не могу никак прокоментить сам хз а освобождать в рекурсивной ф-ции.... честно не уверен что так можно. Это сообщение отредактировал(а) wolver17 - 6.4.2012, 19:56 |
||||||
|
|||||||
| disputant |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
C++ не хуже Просто если тривиальным методом приведения к треугольной матрице определитель матрицы 10x10 будет считаться грубо в 30 раз дольше определителя 3x3, то рекурсивным методом по минорам - в 600000 раз, только и всего... Если вы хотите динамически выделять память под матрицу nxn - то делайте это примерно так:
(правда, при этом обращение a[i][j] не работает, его надо заменять на a[i*n+j] (можно выкручиваться иначе, чтобы работала запись с двумя индексами, но стоит ли оно того?) и не забывайте освобождать память там, где выделили... Это сообщение отредактировал(а) disputant - 6.4.2012, 23:08 |
||||
|
|||||
| wolver17 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: нет Всего: 1 |
не столь важно, что скорость упадёт, не на калькуляторе ж считаем)) тем более, если паскаль считает на ура, то я 100% уверен, что и с++ будет тоже считать так же. проблема только в том, что возможно где-то при конвертации с паскаля на с++ я допустил ошибку, но никак не могу найти где... если раскоментить три строки кода, которые отвечает за вывод на экран миноров + вычеркнутый элем. алгебраич. дополнения, - видно, что в матрице > 4*4 первые пару итераций рекурсии идут норм, а вот потом начинаются сбои в числах. по debug не могу понять где проблема( если кто-то сможет перекодировать паскаль-код (он 100% рабочий!) на с++ или поможет найти в моём коде ошибку, буду очень очень признателен!!! |
|||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Мля, ну если так важно именно таким...
Вот втупую переведенный на C++ код. Проверять не стал, смотрите сами. Только еще раз говорю - не метод это! Как и ожидалось, если для 10 он мучил 4 (!!!) секунды (что там делать 4 секунды нормальным способом?!), то для 11 - уже 43 секунды...
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Вот готовое решение. Здесь же. На vigrad'e.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |