Библиотека для работы с матрицами

 

Последнее время тема работы с матрицами стала весьма актуальной. Чтобы не засорять ветку "Гипотеза на базе Фурье", по предложению из которой Urain написал свою библиотеку Matrix_solve_lib, я решил создать отдельную ветку.

У меня уже была написана подобная библиотека (на C++; широкое использование объектов мало способствует возможности создания dll), поэтому я решил её частично перенести на mql4. За два дня перевёл примерно 1.5к строк.

Реализованы операции:

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

Точность операций иногда контролируется :)

Я уже выкладывал (ветка "Гипотеза на базе Фурье", стр. 9) заголовочный файл своей библиотеки. Сейчас он значительно пополнился и первая тестовая версия библиотеки уже в принципе готова к использованию. В прилагаемом архиве находятся: тестовый скрипт (\experts\scripts\LibMatrixTest.mq4), заголовочный файл библиотеки (\experts\include\LibMatrix.mqh) и исходный код самой библиотеки (\experts\library\LibMatrix.mq4).

Целью библиотеки ставилась не краткость и оптимальность кода, а эффективность и точность работы алгоритмов. При необходимости вы можете самостоятельно оптимизировать код.

Были проведены тесты скорости (тестовые условия: матрица заполнялась случайными числами в диапазоне [-1;1], mt4 build 216, winxpsp2, amd6000+, 3 gb ram; точность вычислений (по умолчанию) - 0.000000001) обращения матриц при помощи метода Жордана-Гаусса.

  • 10x10 - 0 ms
  • 50x50 - 125 ms
  • 100x100 - 984 ms
  • 200x200 - 8031 ms
  • 500x500 - 125015 ms

Т.е. библиотека работает достаточно быстро.

В этой теме я предлагаю обсудить возможности предложенной библиотеки с целью дальнейшего развития и доработки.

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

Замечания к стилю написания кода будут выслушаны и возможно приняты во внимание. Комментарии в коде будут написаны позднее, если в них будет необходимость (оригинальный код на C++ я легко читал без комментариев спустя 4 месяца после его написания). Документация частично есть (смотрите файл LibMatrix.mqh и начало файла LibMatrix.mq4).

В ближайшем будущем я планирую написать статью (уже пишу ;-)) с примерами использования библиотеки и некоторыми замечаниями.

Файлы:
 

Большое спасибо, lea. Очень полезная библиотека. Пока не смотрел, но напишу, если что накопаю нехорошее.

 

Присоединяюсь.


Замечания по стилю: не жалейте пробелов в тексте программ, коллега.

Названия функций слегка заумные.

 
Я думаю, что присоединятся все, кто использует матричное исчисление. Спасибо!
 
Сегодня "день матрицы". Там на форуме ещё одну матричную библиотеку выложили....
 
AlexEro писал(а) >>
Сегодня "день матрицы". Там на форуме ещё одну матричную библиотеку выложили....

:) Я уже посмотрел.

Замечания про пробелы и имена функций учту.

 
Интересно … у меня есть клиент, который по его словам, использует матрицы в торговле … пришел ко мне с аренды выделенного сервера

Мне интересно было бы сравнить скорость обработки матриц … у меня машины тоже winxpsp2 … 

Могу предоставить вам доступ к самой слабой машине на моем сервисе, бесплатно для теста … результаты выложите на форуме … 

Если интересно обращайтесь на мыло … предварительно напишите ваш емейл мне в личку на форуме …
 
RIV >>:
Интересно … у меня есть клиент, который по его словам, использует матрицы в торговле … пришел ко мне с аренды выделенного сервера …

Мне интересно было бы сравнить скорость обработки матриц … у меня машины тоже winxpsp2 …

Могу предоставить вам доступ к самой слабой машине на моем сервисе, бесплатно для теста … результаты выложите на форуме …

Если интересно обращайтесь на мыло … предварительно напишите ваш емейл мне в личку на форуме …


Смотря что. Если он просто ваяет линейную регрессию с МНК (метод наименьших квадратов), то ему достаточно перемножения матриц и решения системы линейных уравнений.

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

Так что смотря что, смотря что.

 
>> AlexEro

Что и как считает клиент, что у меня сидит, я естественно точно не знаю … но вижу, что он периодически умудряется подгрузить 12-ти ядерную машину на 12-14% от мощности всех процов … хорошо хоть что всего на 2-3 секунды … хотя в основном его машина сидит как и остальные около 1% …видимо у него срабатывают какие то условия и запускается расчет …

Что касается библиотеки, что представил lea, то я увидел что он выложил время расчета и мне просто стало интересно погонять именно тоже самое только на моей самой слабой машине … чтобы сравнить мощность машин а не то что он и как считает
 
RIV >>:
>> AlexEro

Что и как считает клиент, что у меня сидит, я естественно точно не знаю … но вижу, что он периодически умудряется подгрузить 12-ти ядерную машину на 12-14% от мощности всех процов … хорошо хоть что всего на 2-3 секунды … хотя в основном его машина сидит как и остальные около 1% …видимо у него срабатывают какие то условия и запускается расчет …

Что касается библиотеки, что представил lea, то я увидел что он выложил время расчета и мне просто стало интересно погонять именно тоже самое только на моей самой слабой машине … чтобы сравнить мощность машин а не то что он и как считает


Для подргузки многоядерного проца матричной библиотекой - её надо компилить Intel компилятором со специальными опциями, и в самой программе это надо СЛЕГКА учитывать, например как параметрами ROLL UNROLL в библиотеке Linpack. Иначе на один поток (одну программу EXE) всегда работает ОДИН процессор - на расчёт, а второй - на обработку графики GUI (всего два).

 
>> AlexEro
Скорее всего у него внешняя длл для метатрейдера где он всё и считает … как он там собрал эту длл неизвестно … у меня впс и независимо от того что крутится внутри машины, вся машина всё равно обрабатывается определенным кол-вом потоков … у меня мысли про оптимизацию а не подгрузку … спасиб
Причина обращения: