Матрицы и матричное программирование

17.04.24

Разработка - Математика и алгоритмы

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

Скачать исходный код

Наименование Файл Версия Размер
Матрицы и матричное программирование
.epf 12,66Kb
0
.epf 1.0 12,66Kb Скачать

Всем привет!

Представлена внешняя обработка на обычных формах, тестировал на пустой базе 1С:Предприятие 8.3 (8.3.23.1865).

Версия платформы не имеет значения - поскольку платформенные функции и процедуры не использую.

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

Матрица в широком смысле и в платформе 1С представляется как двумерный массив массивов. Для преобразования начальной строки матрицы в двумерный массив массивов я использую функцию преобразования (собственной разработки).

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

Обработка представляет из себя ДЕМО - СТЕНД.

Обработку надо открывать через меню Файл-Открыть. Задаете вручную две матрицы в левом поле и поле посередине. Выбираете флажок для алгебраического преобразования и нажимаете кнопку "Выполнить". Результат расчета будет показан на правом поле. Ниже будет представлено видео - лучше один раз посмотреть.

На данный момент в обработке разработаны и собраны такие функции:

  • копирование матрицы
  • деление матрицы на скаляр
  • умножение матриц
  • транспонирование матрицы
  • вычеркивание из матрицы i-той строки и j-того столбца
  • получение определителя матрицы - используется один из способов получения определителя
  • получение единичной матрицы
  • возведение в степень
  • получение расширения матрицы

Также в расчет были добавлены функции преобразования чисел с запятой в дроби: то есть число 0,6666667 можно преобразовать в дробь 2/3. Далее использовать дроби в алгебраических преобразованиях матриц. Таким образом будет получен более точный результат вычислений.

Для преобразования чисел в дроби используется алгоритм Евклида или что тоже самое алгоритм получение НОД - наибольшего общего делителя. В демо-стенде можно испытать умножение дробей, преобразование числа в дробь и обратно, получение дробей с разным округлением чисел - так к примеру, для чисел 0,67 и 0,667 будут рассчитаны разные дроби: 67/100 и 667/1000. 

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

Вы можете отдельно от матриц только "Найти НОД" - выберите флажок и нажмите "Выполнить". Обработка предложит вам задать два числа - для которых будет найден НОД, результат будет выведен в служебное сообщение пользователя.

Также вы можете отдельно протестить умножение чисел в виде дробей. Дроби задавайте через точку - которая отделяет целую и дробную часть. Возведите флажок "Умножение чисел" и нажмите "Выполнить" - см. рис.


 

 
 Видео работы демо-стенда

 

 

 

Результаты расчетов сравнивались с калькуляторами матриц онлайн.

На сегодняшний день обработка представляет из себя лишь математический и исследовательский интерес. Была разработана на энтузиазме и по следам неведомых мотиваций. В промышленной эксплуатации не применялась.  

На этом все. Всем добра!

С пользой для клиентов, Рустем

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 10.3, релизы 10.3.88.3

Матрицы матричное программирование

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1926    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4789    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7823    5    SpaceOfMyHead    17    

56

Мини-обзор разных решений задач

Математика и алгоритмы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    3155    RustIG    6    

25

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7998    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4603    fishca    13    

37

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    9029    John_d    73    

46
Отзывы
15. RustIG 1619 28.11.23 10:04 Сейчас в теме
(9) есть в 1С много такого, до чего руки не дотянутся за всю карьеру 1с-ника. Например, кто-то не будет разбираться с ОНО и ОНА - отложенными налоговыми обязательствами и активами соот-но. (но замечу, что с ОНО и ОНА уже разобрались и без нас).
Тоже самое с оптимизационными задачами в экономике.
Автоматизация учета - это прежде всего учет - ввод данных, контроль, агрегация.
Анализ и тем более нахождение оптимума - это неявная задача - сама не возникает.
Ее нужно правильно разглядеть, сформулировать и написать зависимости между переменными - таким образом построить математическую модель.
Многие экономические задачи уже давно обдуманы и собраны по ним математические модели - большая сложность разглядеть в своем производстве или продажах эти зависимости и применить ту или иную матмодель.
Программирование и тем более использование матриц для решения оптимизационных задач - это уже норма или стандарт.
В каждой среде разработки есть свой математический пакет для простых операций с разными классами объектов: в том числе с деревьями, матрицами и более сложными.
Сейчас показать вам пользу на пальцах не получится - поскольку нет в 1с аппарата для решения задач, и мало открытых кейсов - хотя сами кейсы есть - о них просто не распространяются. Многие задачи на производстве и продажах решаются в среде Excel , MatLab , Maple , Mathematica , Java , VC++ , Python и т.д.
И они закрыты коммерческой тайной.
JohnyDeath; user658002_SvanMoscow; user1481466; kalyaka; user1636469; +5 Ответить
29. RustIG 1619 30.11.23 11:31 Сейчас в теме
Добавил базовые операции с матрицами:
- копирование
- деление на скаляр
- возведение в степень
- получение единичной матрицы
- получение расширенной матрицы

Также добавил представление матрицы
- с округлением до определенного знака
- представление в виде дроби (с учетом округления из пред. пункта)

см. картинку в публикации
Oxygraphis; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. spectre1978 60 27.11.23 15:30 Сейчас в теме
Вводить матрицы в многострочное редактируемое поле...
Не из серии ли это "в гамаке и стоя"?
А почему бы не использовать какой-нибудь вариант табличного поля? И проще, и лучше.
2. RustIG 1619 27.11.23 15:45 Сейчас в теме
(1) мое недопонимание вашему вопросу - как раз кот хорошо отразил
Прикрепленные файлы:
3. lunjio 66 27.11.23 15:53 Сейчас в теме
(2)
Наверное он имел ввиду, раз это массив массивов, это хорошо укладывается в табличную часть, где можно добавлять столбцы, программно.
Так будет легче и понятнее вводить, не надо парсить строку.
Просто таблица, с кнопочкой добавить столбец. На выходе получаете таблицу значений с колонками идущими подряд.
4. spectre1978 60 27.11.23 16:10 Сейчас в теме
(3) ну да, типа такого. Разбирать строки и разбирать все возможные ошибки ввода, в том числе и не очень явные, когда, например, где-то не хватает значений - это ж извращение какое-то. Куда логичнее свалить это все на поля, где уже нельзя ввести ничего неправильного, кроме цифр ничего не вводится, а невведенное значение трактуется как ноль.
7. RustIG 1619 27.11.23 17:12 Сейчас в теме
(4) хорошо, хорошо, если вам удобно табл поле использовать , то спорить не буду. В табл поле тоже придется проверять все введенные и невведенные значения. Дело ваше.
6. RustIG 1619 27.11.23 17:10 Сейчас в теме
Я могу ввести любую матрицу 3х3, 5х5, 7х8, 9х9 для тестирования алгоритмов быстрее , чем вводить их в любое другое поле. Далее готовые процедуры и функции из пакета ( модуля) используются для любой размерности матрицы. Выводить матрицу большого размера ни в какое поле будет не удобно, но для отладки использовать многострочную строку самое то.
11. kalyaka 1071 28.11.23 09:38 Сейчас в теме
(6) я тоже использую подход с вводом табличных данных через текстовое поле. Только я использую формат текста JSON - и наглядно и сразу можно преобразовать в тип данных
[
    [1, 2, 1],
    [0,-1, 0],
    [2, 3, 1]
]
wonderboy; +1 Ответить
14. RustIG 1619 28.11.23 09:52 Сейчас в теме
(11) я добавил описание в статью - хочется быстрого старта для развития матричных операций.
Джейсон это хорошо. Спасибо за отзыв.
16. RustIG 1619 28.11.23 10:18 Сейчас в теме
(11) с какими задачами применяете матрицы?
18. kalyaka 1071 28.11.23 11:23 Сейчас в теме
(16)Пока только ищу решение на СЛАУ для использования в модели распределения
5. RustIG 1619 27.11.23 17:06 Сейчас в теме
Алгебраические операции производятся над массивами. Результат итоговый или промежуточный можно вывести в служебные сообщения, здесь поле 3 для матрицы 3 использую только того, чтобы увеличить шрифт и задать центрирование для красоты. А таблица значений, табличная часть, табличное поле это временный и неудобный вариант работы с матрицами.
8. scientes 290 27.11.23 17:37 Сейчас в теме
С матричными операциями сталкивался при решении задач по программированию. Например такой, вычислить по модулю число Фиббоначи для очень больших значений порядкового номера числа. Один из вариантов состоит в применении матричного преобразования вида:
(fn [ 1 1 ] (fn-1
= [ 2 1 ] fn-2)
fn+1)

Для быстрого вычисления требуется возведение в степень матрицы перехода.
9. user1636469 27.11.23 17:55 Сейчас в теме
Какое прикладное применение в области автоматизации учетов и производств?
10. spectre1978 60 28.11.23 07:55 Сейчас в теме
(9) в матричной форме часто записывают задачи линейного программирования для решения симплекс-методом. Правда, за 25 лет работы могу вспомнить всего от силы пару-тройку раз, когда кто-то пытался применить ЛП или ЦП в реальной работе на предприятии. Ну... еще первый семестр вуза вспомнить, как раз там на первых практиках и лабах матрицы перемножали и определители считали.
12. kalyaka 1071 28.11.23 09:42 Сейчас в теме
(10) мне на практике часто встречаются задачи на распределение одно на другое. Сейчас я решаю такие задачи методом динамического программирования. Ищу способ как те же задачи решать с использованием СЛАУ, чтоб математически точно, предсказательно и без погрешностей
13. user1636469 28.11.23 09:46 Сейчас в теме
(12)
на распределение одно на другое.

Ну хотя бы один пример приведите реальный, чтобы нам тоже можно было более эффективно решать задачи, может сразу код какой-то на 1С, обработку
17. kalyaka 1071 28.11.23 11:16 Сейчас в теме
(13) Списание лимитов
Есть исходная таблица на оплату по аналитикам учета, остатки лимитов расхода денежных средств. Списание лимитов ступенчатое:
1. лимиты, определенные по контрагенту и договору
2. по контрагенту
3. по статье, по всем контрагентам
4. по статье Непредвиденные расходы
На выходе должна получиться таблица расхода лимитов. Математически это выглядит так:
Таблица на оплату Х Отношение по приоритетам Х Остатки лимитов => Расход лимитов

Работа с заявкой на оплату
Есть исходная таблица на оплату по аналитикам учета. Далее заявка размещается по расчетным счетам, далее размещение по счетам размещается в платежных документах и, наконец, выписка распределяется по платежным документам, по размещениями и по заявкам. Здесь на каждом этапе размещения может указываться как полный набор аналитик и измерений, так и не полный. Математически это выглядит так
Выписка Х Платежные документы Х Отношение по полноте аналитик в платежном документе Х Отношение по полноте аналитик в размещении заявки на расчетных счетах Х Таблица на оплату => БДДС
, где "Отношение по полноте аналитик в платежном документе":
1. Расчетный счет + Размещение + Заявка + набор аналитик
2. Расчетный счет + Размещение + Заявка
3. Расчетный счет + Размещение
4. Расчетный счет

Пример кода:
    МодельРаспределения = Общий.МодельРаспределения(МенеджерВременныхТаблиц)
        .Таблица("ВТ_ДВИЖЕНИЯ_ОПЕРАЦИИ_КБ")
            .Измерения()
                .Поле("ИдентификаторПозицииБюджетирования")
                .Поле("ЕстьРаскрытиеЭскроу")
            .Реквизиты()
                .Поле("*")
            .Ресурсы()
                .Поле("Сумма")
            .Порядок("ДокументПланированияДатаНачала")
            .Порядок("ДокументПланирования")
        .Отношение("ВТ_ОТНОШЕНИЕ_КБ")
            .ИзмеренияТаблицы()
                .Поле("*")
            .ИзмеренияБазы()
                .Поле("Организация")
                .Поле("ДоговорЭскроу")
                .Поле("Проект")
                .Поле("ОбъектИнвестирования")
                .Поле("СтатьяДДС")
            .Порядок("Порядок")
        .База("ВТ_ОСТАТКИ_БДДС_КБ")
            .Измерения()
                .Поле("*")
            .Реквизиты()
                .Поле("Банк")
                .Поле("Очередь")
            .Ресурсы()
                .Поле("Сумма")
            .Порядок("Очередь")
    ;
Показать
Реклассификация затрат
Есть исходная таблица затрат по аналитикам и ресурсам. Аналитики: объект затрат, статья. Ресурсы: Материалы: НДС, Без НДС; Работы: НДС, Без НДС, Удержание: НДС, Без НДС + производные ресурсы: Сумма всего = сумма всего НДС + сумма всего Без НДС. Есть таблица затрат целевая, к которой необходимо перейти от исходной. Математически:
Исходная таблица Х Целевая таблица => Таблица реклассификации затрат
Пример кода:
    МодельРаспределения
        .Таблица("ВТ_ЗАЧЕТ_КОРР")
            .Ресурсы()
                .Поле("ЗачетАванса")
                .Поле("ЗачетАвансаБезНДС")
                .Поле("ЗачетАвансаНДС")
        .База("ВТ_ЗАЧЕТ")
            .Реквизиты()
                .Поле("*")
            .Ресурсы()
                .Поле("*")
            .Порядок("ЗачетАванса", "+")
    ;
    МодельРаспределения.Распределить();
Показать
Подробнее по модели распределения можно посмотреть в статье
JohnyDeath; user1636469; +2 Ответить
19. ktb 620 28.11.23 12:19 Сейчас в теме
(13) Резервирование с неполным набором свойств
Есть товар с неким набором свойств.
Поступают заказы от покупателей, где указаны только важные для каждого из них значения свойств, остальные не указаны.
Требуется определить, можем ли мы зарезервировать товар по очередному заказу с учетом существующих резервов.
30. RustIG 1619 30.11.23 11:33 Сейчас в теме
(12)
без погрешностей

используйте алгебру дробей
15. RustIG 1619 28.11.23 10:04 Сейчас в теме
(9) есть в 1С много такого, до чего руки не дотянутся за всю карьеру 1с-ника. Например, кто-то не будет разбираться с ОНО и ОНА - отложенными налоговыми обязательствами и активами соот-но. (но замечу, что с ОНО и ОНА уже разобрались и без нас).
Тоже самое с оптимизационными задачами в экономике.
Автоматизация учета - это прежде всего учет - ввод данных, контроль, агрегация.
Анализ и тем более нахождение оптимума - это неявная задача - сама не возникает.
Ее нужно правильно разглядеть, сформулировать и написать зависимости между переменными - таким образом построить математическую модель.
Многие экономические задачи уже давно обдуманы и собраны по ним математические модели - большая сложность разглядеть в своем производстве или продажах эти зависимости и применить ту или иную матмодель.
Программирование и тем более использование матриц для решения оптимизационных задач - это уже норма или стандарт.
В каждой среде разработки есть свой математический пакет для простых операций с разными классами объектов: в том числе с деревьями, матрицами и более сложными.
Сейчас показать вам пользу на пальцах не получится - поскольку нет в 1с аппарата для решения задач, и мало открытых кейсов - хотя сами кейсы есть - о них просто не распространяются. Многие задачи на производстве и продажах решаются в среде Excel , MatLab , Maple , Mathematica , Java , VC++ , Python и т.д.
И они закрыты коммерческой тайной.
JohnyDeath; user658002_SvanMoscow; user1481466; kalyaka; user1636469; +5 Ответить
20. bayselonarrend 1206 28.11.23 14:19 Сейчас в теме
(15)Это не оно?
Прикрепленные файлы:
21. bayselonarrend 1206 28.11.23 14:24 Сейчас в теме
(15)Или вот это
Прикрепленные файлы:
23. gzharkoj 504 28.11.23 19:30 Сейчас в теме
(21) Там свои проблемы. Пробовал как-то ради интереса. Описал тут https://infostart.ru/1c/articles/1761663/, что вышло, если вкратце сомнительно вышло.
dabu-dabu; ildarovich; bayselonarrend; +3 Ответить
24. RustIG 1619 28.11.23 20:02 Сейчас в теме
(23)спасибо за ссылку. Поиск по Инфостарт вашу статью не выдавал
gzharkoj; +1 Ответить
31. RustIG 1619 30.11.23 12:26 Сейчас в теме
(23) со статьей ознакомился - но применить из нее в своей обработке мне нечего, поэтому и сказать нечего :)
а выводы по статье очень сложно мне сделать...
22. SerVer1C 764 28.11.23 17:10 Сейчас в теме
Пробовали ваши алгоритмы на матрицах размерностью 100*100 ? Интересно, будет ли вычисляться за вменяемое время?
25. RustIG 1619 28.11.23 20:12 Сейчас в теме
(22) 100 х100 ? А какую именно операцию вам посчитать? Сложность алгоритмов заранее известна для каждой операции. Как бы 100 х 100 это немного. Другое дело , ранг матрицы одна из трудоемких операций . Для ее быстрого расчета уже придуманы оптимизированные алгоритмы. Стоит ли на это тратить время? Тестить алгоритмы, которые годами преподают в универе. В реальности такой задачи не будет -мы же экономические задачи решаем, а не космические. Но ваш подход нужно учитывать несомненно! Поэтому к следующей публикации будут некоторые замеры. Я уже по алгоритму понимаю , где будут проблемы, поэтому некоторые алгоритмы придется замерять.
26. wonderboy 379 29.11.23 09:33 Сейчас в теме
С матрицами сталкивался только в 3Д-графике, когда под OpenGL программировал.
В 1С что-то ни разу не приходилось пока.

Вопрос только один по статье. Кто этот самый "Джон Галл" ?
27. ildarovich 7865 29.11.23 15:48 Сейчас в теме
Кажется, "эта дорога не ведет к храму".
Другими словами, с важностью заявленной темы я согласен, а с реализацией - нет.
Впрочем, и сама 1С тут не дает хорошего примера, что показывает, в частности, комментарий (23) и ссылка из него.
Реализации операций над матрицами имеет множество подводных камней.
Тут недостаточно доморощенной реализации и тестирования у нескольких клиентов по принципу "сегодня отработало без ошибок".
Даже при умножении матриц можно столкнуться с резким падением производительности из-за особенностей представления чисел в платформе.
А при вычислении обратных матриц в случае различающихся порядков собственных чисел "наивные" алгоритмы закономерно перестанут сходиться. Это область так называемых "численных методов".
Так что я в данном случае против доморощенных реализаций и за применение проверенных математических пакетов или библиотек.
mikmaster; dabu-dabu; wonderboy; +3 Ответить
28. scientes 290 30.11.23 10:38 Сейчас в теме
Согласен с Сергеем, что специализированные пакеты лучше справляются с задачей решения СЛАУ. Представленная разработка в первую очередь направлена на развитие навыков и умений автора и удовлетворение его любопытства, что, разумеется, правильно и хорошо. Недавно нашел уточняющий коэффициент в формуле Харди- Рамануджана для подсчета количества неупорядоченных разбиений числа. Практическая ценность нулевая, но получил хорошую практику в работе с длинной математикой в 1С.
29. RustIG 1619 30.11.23 11:31 Сейчас в теме
Добавил базовые операции с матрицами:
- копирование
- деление на скаляр
- возведение в степень
- получение единичной матрицы
- получение расширенной матрицы

Также добавил представление матрицы
- с округлением до определенного знака
- представление в виде дроби (с учетом округления из пред. пункта)

см. картинку в публикации
Oxygraphis; +1 Ответить
32. RustIG 1619 30.11.23 12:26 Сейчас в теме
Обновление 30-11-2023г. Добавил видеообзор.
33. RustIG 1619 07.12.23 12:26 Сейчас в теме
Обновление 07-12-2023. Добавил умножение дробей.
Прикрепленные файлы:
Оставьте свое сообщение