Что нового

Matrix - UDF. Функции для работы с двумерными числовыми матрицами

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
AutoIt: 3.3.8.0
Версия: 2.0
Категория: Математика / Линейная алгебра
Описание: Набор функций для выполнения алгебраических и матричных операций над матрицами, такие как сложение, умножение, транспонирование, обращение матриц, и т.д. Полный список функций и их описаний ниже:
_Matrix_Add (Сложение матриц)
_Matrix_Subst (Вычитание матриц)
_Matrix_Identity (Единичная матрица)
_Matrix_MZeros (Нулевая матрица)
_Matrix_NumProd (Произведение матрицы на число)
_Matrix_VecProd (Произведение матрицы на вектор справа - тоже самое, что произведение матрицы на матрицу-столбец)
_Matrix_Transpose (Транспонирование матрицы)
_Matrix_MProd (Произведение двух матриц)
_Matrix_Power (Степень от матрицы - получается последовательным умножением матрицы на саму себя)
_Matrix_LinSolver (Вектор-решение СЛАУ - используется LUP-разложение, устойчивое по отношению к нулевому ведущему элементу)
_Matrix_Inverse (Обратная матрица)
_Matrix_Deter (Определитель/Детерминант матрицы - находится с использованием формулы Коши-Бине для компонент при LUP-разложении)
_Matrix_Commut (Коммутатор двух операторов в матричной форме)
_Matrix_Trace (След/Шпур матрицы)
_Matrix_Norm (Различные нормы от матриц)
_Matrix_Minor (Минор матрицы)
_Matrix_CoMinor (Дополнительный минор квадратной матрицы/определителя)
_Matrix_Cofactor (Кофактор матрицы или алгебраическое дополнение)
Примеры: В приложенном архиве
Screenshot: N/A
Источник: Kaster
Автор(ы): Kaster
Дополнение
Матрицей называется математический объект состоящий из пронумерованных элементов, которые можно представить в виде прямоугольной таблицы. К матрицам применимы "обычные" алгебраические операции, такие, как сложение, умножение матрицы на матрицу, вычитание, возведение в степень, и, также ряд "необычных" (по отношению к действительным числам) операций - траспонирование, обращение, взятие шпура (след), нахождение минора, нахождение нормы, коммутатора, и т.д. Основное применение матричное исчисление находит при решении системы линейных алгебраических уравнений (СЛАУ), так как в этом случае задача, в большинстве своем, сводится к нахождению обратной матрицы.
Заметки на полях
Заинтересованных прошу усиленно протестировать функции. Все результаты проверялись стандартными средствами Excel. Обо всех багах/пожеланиях/замечаниях очень прошу сообщить.
 

Вложения

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
Re: [Математика] Matrix - UDF. Функции для работы с двумерными числовыми матриц

Ссылка на Минор не работает. :(

Архив лучше расположить в аттаче.

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

+1

:smile:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Математика] Matrix - UDF. Функции для работы с двумерными числовыми матрицами

Yashied сказал(а):
Ссылка на Минор не работает. :(
Поправил
Yashied сказал(а):
Архив лучше расположить в аттаче.
Сделано. Хотя, какая разница ;D
Yashied сказал(а):
А вообще библиотека очень понравилась (правда матрицы уже все позабыл, давно это было).
Я бы тоже забыл, да не получится. Работа такая
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: [Математика] Matrix - UDF. Функции для работы с двумерными числовыми матрицами

Красотища-то какая))) А я не так давно спрашивал про матрицы.

Ещё особо не смотрел, но:
1) Моё мнение: лучше использовать ByRef. В этом случае массивы не будут каждый раз копироваться в новую область памяти. Если функции используются очень интенсивно, то это может быть критично.
2) Определитель треугольной матрицы равен проивзедению элементов главной диагонали. А матрицу привести к треугольному виду не так сложно. Правда страдает точность.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Математика] Matrix - UDF. Функции для работы с двумерными числовыми матрицами

SyDr сказал(а):
Моё мнение: лучше использовать ByRef
да. можно. просто для тестирования надо было передавать массивы не обязательно в виде переменных
SyDr сказал(а):
Определитель треугольной матрицы равен проивзедению элементов главной диагонали.
да, знаем-с ;)
SyDr сказал(а):
А матрицу привести к треугольному виду не так сложно
ну, во-первых не всегда возможно ;D
а во вторых, метод Гаусса, и метод лежащей на его основе - LU-разложение, как раз сейчас я на этапе его реализации... так что со временем все будет.
Спасибо за отзыв

Добавлено:
Сообщение автоматически объединено:

ЛОЛ. в главном сообщении я не вижу вложения, кроме той, что ведет на внешнее хранилище
Добавлено:
Сообщение автоматически объединено:

Таки победил детерминанты и обратные матрицы ;D
Считается через LU-разложение. Да, менее устойчива чем LUP и крэшится при нулевом первом элементе, но считает матрицу 100 х 100 за 2 сек!
Выложу завтра (формально сегодня)
Добавлено:
Сообщение автоматически объединено:

Выложил и обновил сообщение в шапке
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 528
Репутация
325
Хм. Очень эта тема стала для меня актуальной после поступления в универ :smile:
Но 2D матрицы это маловато... Т.к. мы считаем минимум 3х3... Поэтому вопрос к автору, нельзя ли расширить? :smile:
Так же хотелось бы увидеть функцию алгебраического дополнения :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
Medic84 сказал(а):
Но 2D матрицы это маловато... Т.к. мы считаем минимум 3х3...
Матрицы вы в универе будете считать максимум 1 семестр, и дальше их уже касаться почти не будете. А вообще, 3x3, это и есть 2D матрица, как и любая m x n.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
Medic84
ты думал 2D - это матрица 2х2? ;D
Кстати говоря, матрицы в теории матриц исключительно 2D. Объекты размерностью меньше - скаляры и векторы, больше - тензоры. Ну собственно говоря все эти объекты - есть тензоры. просто разного порядка. если будут вопросы про матрицы, спрашивай. я на них собаку съел.

что касается UDF, у меня было очень много мыслей по поводу оптимизации, и очень много даже было сделано, но для Python. а вот имплементировать все это в AutoIt как-то руки не дошли, к сожалению. Тоже касается и UDF с комплексными числами.
 

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Для решения систем линейных уравнений требуется находить обратную матрицу или определитель матрицы 9*9. Матрица сильно разряжена и в большинстве случаев на главной диагонали будут нули, особенно в первом элементе. Есть ли способы решения систем уравнений на AI? очень надо.
Есть матрица 9** и вектор свободных членов 9 элементов.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Core2Duo76
используй matlab, там уже все оптимизировано, для разреженных матриц в том числе. по поводу твоего вопроса, для решения не обязательно находить обратную матрицу. есть, так называемые, итеративные методы, решение которых сходится к истинному, но с определенной погрешностью. эта погрешность регулируема и влияет на количество итераций. поэтому можно добиться вполне приличных результатов за меньшее количество вычислений. к слову говоря, именно итеративные методы используются для обращения больших матрицы или для решения большой СЛАУ
 

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Возникло маленькое недопонимание - мне надо реализовать решение именно на AI! Такие матрицы и в маткаде решать можно, а он установлен не у всех. Про итеративные методы тоже читал на wiki, даже нашел код на С++ метода треугольников, но почему то он не работает после переписывания на AI. Маткадом проверяю правильность работы скрипта.

Решить СЛАУ просто сначала пытался через обратную матрицу, но элемент 0;0 у меня будет заведомо равен 0, а для метода Крамера _Matri:rofl:etMinor захавал 10сек времени, т.е. 100 секунд на полное решение системы.
_Matri:rofl:et тоже не подходит из-за элемента 0;0. Для ясности - Задачник Яблонского по Теоретической механике, задача С9. Знания позволяют составить БД правильных ответов искомой силы и сравнивать ее с той, что получается в скрипте (последняя неизвестная из 9). Получится программа, проверяющая правильность составления матрицы коэффициентов уравнения (их студент вычисляет, все 81)
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Core2Duo76
метод треугольников это не итеративный метод. итеративные методы описаны тут СЛАУ
самый простой, но и самый медленный - это метод якоби.
но, раз тебе надо точное решение, то могу дать код на python где использовано LUP разложение, а не LU, как в этой библиотеке. то есть несмотря на разреженность, если детерминант ненулевой, или решение заведомо существует, то LUP разложение решит задачу.
я его пытался перевести на AutoIt но из-за нехватки времени не смог убрать все баги из-за различий в языках.
 

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Я нашел недочет Алгоритме треугольников - на главной диагонали не должно быть нулей, ее легко исправить перестановкой строк, все заработало!
Про СЛАУ там читал.
Про LUP разложение напишу в личке, если возникнут проблемы с реализацией моего скрипта. ПО заявлению его автора, он полностью рабочий, так как знаю где он его применил. Спасибо!
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
Core2Duo76 [?]
ПО заявлению его автора, он полностью рабочий
ты никак со стариной тьюрингом с того света пообщался? :rofl:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
И так, по прошествии более чем 2 лет, обновляю библиотеку, в связи с недавно возникшими вопросами тут, и в конференции. Надо полагать, у студентов сессия дает о себе знать :laugh:

Первый пост, как собственно и сама библиотека, чуть более чем полностью переделаны.
Смотрим шапку.


Добавлено:
Сообщение автоматически объединено:

Некоторые замечания
1. Для решения СЛАУ применяется разложение матрицы на верхне- и нижнетреугольные матрицы (LU) с перестановкой ведущего элемента для исключения деления на нуль. Такое разложение наз-ся LUP-разложение матрицы.
2. Данное разложение так же позволяет находить детерминант посредством формулы Коши-Бине
det(A*B) = det(A)*det(B). В нашем случае, P*A = L*U => det(A) = det(L)*det(U)/det(P). Известно, что для верхне- и нижнетреугольных матриц детерминант равняется произведению диагональных элементов. Так же по определению LUP-разложения, диагональные элементы нижнетреугольной матрицы L единицы. И последнее, матрица P наз-ся матрицей перестановок и состоит из одних лишь единиц и получается перестановкой строк от единичной матрицы. Каждая перестановка меняет знак определителя на одну, поэтому окончательное значение это всего лишь det(P) = (-1)^N, где N - кол-во перестановок, которое известно по окончанию LUP-разложения. Итого det(A) = det(U)*(-1)^N
3. Так же LUP-разложение позволяет относительно легко с точки зрения построения алгоритма находить обратную матрицу.

На моей машинке с относительно средним процессором в 2.6 ГГц СЛАУ с матрицей 100х100 решается примерно за 1 сек, а СЛАУ 200х200 за 6 сек, что в принципе недостижимо если обращать матрицу по определению, через алгебраические дополнения.

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

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

Прошу написать о любых багах, недочетах, пожеланиях. Пока есть время и интерес, могу исправить максимально быстро.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
у кого нибудь сохранилась эта библиотека? у меня, к сожалению, нет.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
356
Еще нужно?
Случайно увидел в архиве.
 

Вложения

Верх