Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нерекурсивное нахождение определителя матрицы 
:(
    Опции темы
Royan
  Дата 14.5.2004, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Недавно появилось желание вернуться к старой проблеме. А именно найти определитель матрицы но не рекурсивно, а грубо говоря с помощью цикла. Пока идея у меня такова, только как ее реализовать, хотя вроде бы все кажется и очевидно, я не знаю:

Имеем матрицу (к примеру 5х5):
+++++
+++++
+++++
+++++
+++++



необходимо сначала перебрать все миноры (обозначены ноликами) размерностью 3х3, чтобы вычислить определитель первого минора рангом 3+1 то есть:
+++++ +++++ +++++ +++++
+++++ ++ooo ++ooo ++ooo
++ooo +++++ ++ooo ++ooo
++ooo ++ooo +++++ ++ooo
++ooo ++ooo ++ooo +++++


потом для второго минора рангом 3+1

+++++ ++ooo ++ooo ++ooo
+++++ +++++ +++++ +++++
++ooo +++++ ++ooo ++ooo
++ooo ++ooo +++++ ++ooo
++ooo ++ooo ++ooo +++++


ну и так далее. Проблема в том, что нельзя допустить чрезмерного количества итераций. Для чего я исользую вектор "затенения", он содержит как раз идексы рядов, которые трогать не надо (или надо), то есть для рассмотренных выше случаев:
0
1
1
1
1


и соответственно

1
0
1
1
1


На первый взгляд все просто, но если ранг исходной матрицы сделать >5, то вычисление новых значений вектора "затенения" у меня вызывает проблемы.

Может кто со свежей головой подкинет пару толковых идей, о том как вычислять вектор?

Это сообщение отредактировал(а) Royan - 14.5.2004, 14:23


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Akina
Дата 14.5.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Очень хочется спросить - а зачем? не нравится рекурсия - приводи матрицу к диагональному виду...


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

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


Эксперт
****


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

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



обычно используется процедура Гаусса


--------------------
qqq
PM WWW   Вверх
achmed
Дата 14.5.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


PM MAIL   Вверх
Royan
Дата 14.5.2004, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Просто идея в голове родилась и захотелось воплотить ее в жизнь, просто таким алгоритмом можно будет раскрутить матрицу практически любой размерности


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
maxim1000
Дата 15.5.2004, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



можно конечно пользоваться и рекурсивным, но его сложность порядка n!, а сложность Гаусса порядка n^3


--------------------
qqq
PM WWW   Вверх
Royan
Дата 16.5.2004, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Пардон за глупый вопрос, а у кого нибудь есть алгоритм привдения матрицы к диаганальному виду или упомянутая выше maxim1000 процедура Гаусса... если будет еще и код, то тоже будте добры скиньте на мыло, а то приспичило мне... а в нете никак толком ничего и не найти sad.gif

PS Умные учебники по алгебре у меня, к сожалению, вывелись
PPS Пробовал найти инфу на сайтах приведенных в топике "Прежде чем изобретать велосипед" но тоже ни фига не нашел, хотя может плохо искал...


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
maxim1000
Дата 16.5.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



на форуме был не один вопрос по этой теме
кратко можно описать так:
определитель матрицы не изменится, если к строке прибавить другую строку, умноженную на какое-нибудь число
берут первую строку и прибавляют ее к остальным с такими множителями, чтобы в первом столбце получались нули
вот и получается первый столбец с одним единственным ненулевым коэффициентом на первом месте
на это тратится порядка n*n операций
во втором столбике оставляется ненулевой коэффициент на втором месте, и т.д. для всех n столбцов, получается порядка n*n*n операций...


--------------------
qqq
PM WWW   Вверх
DenDen
Дата 16.5.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть очень простой алгоритм, который просто нужным образом ставит перестановки.
Припишем к исходной матрице n*n снизу еще 1 такую же матрицу. получится матрица n*2n
Теперь давайте. Давайте пойдем по первому столбцу вниз перемножая Элементы стоящие на диагоналях получившейся матрицы(начиная с главной) до последнего элемента исходной матрицы. Получившиеся произведения сложим. Теперь возьмем последний столбец и пойдем вниз но уже влево также перемножая элементы и складвывая произведения. Вычтем из первой суммы вторую получим определитель. Почему-то начиная с матриц 3*3 этот алгоритм работает.Сложность 2*sqrt(2)*n*n
PM MAIL   Вверх
maxim1000
Дата 17.5.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Почему-то начиная с матриц 3*3 этот алгоритм работает.Сложность 2*sqrt(2)*n*n

такое ощущение, что на матрицах 3*3 его корректная работа и заканчивается...
порисовал немного для матрицы 4*4
не нашел такой перестановки: (1,1) (2,3) (3,2) (4,4)


--------------------
qqq
PM WWW   Вверх
DenDen
Дата 17.5.2004, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Х.з. я когда развлекался с ним просто создавал матрицы произвольного разменра(с разными слуайными числвами) и считал их с помощью гаусса и этой хрени, получалось что сходятся. Мой друган пытался это доказать, что-то у него получилось, но м.б. он просто ХОТЕЛ, чтобы у него чего-то получилось....вообщем у меня он пока работал, а так...
PM MAIL   Вверх
Royan
Дата 17.5.2004, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Цитата
Давайте пойдем по первому столбцу вниз перемножая Элементы стоящие на диагоналях получившейся матрицы(начиная с главной) до последнего элемента исходной матрицы

Я наверно тупой но я не понял эту фразу, то есть например имеем:

a++++ |
+a+++ |
++a++ | - матрица А
+++a+ |
++++a |

b++++ |
+b+++ |
++b++ |- ее дубликат, назовем её А'
+++b+ |
++++b |


То есть получили a*b + a*b + a*b + a*b + a*b

а далее как идти вниз?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
DenDen
Дата 17.5.2004, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не совсем
a_1 a_2 a_3 a_4
a_5 a_6 a_7 a_8
a_9 a_10 a_11 a_12
a_13 a_14 a_14 a_16
b_1 b_2 b_3 b_4
b_5 b_6 b_7 b_8
b_9 b_10 b_11 b_12

p_1=a_1*a_6*a_11*a_16
p_2=a_5*a_10*a_14*b_4
p_3=a_9*a_14*b_3*b_8


PM MAIL   Вверх
Royan
Дата 18.5.2004, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



а тот факт, что ты забил только три строки матрицы b_N это так и задумано или все-таки надо все четыре?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
DenDen
Дата 19.5.2004, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, надо, конечно все 4
и еще 4 с другого бока
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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