Набор математических функций

22.12.21

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

Небольшой набор математических функций для работы с массивами чисел.

Скачать файлы

Наименование Файл Версия Размер
НаборМатематическихФункций.epf
.epf 11,12Kb
9
.epf 1.0 11,12Kb 9 Скачать

Быстрый поиск по запросу "математи*" по ИС выдаёт всего одну статью с набором полезных математических функций:

Библиотека математических функций 1.1

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

Функция Сумма(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат 0 КонецЕсли;
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Сумма");
	
	Для ё = 1 по Массив.Количество() Цикл
		ТЗ.Добавить();
	КонецЦикла;
	
	ТЗ.ЗагрузитьКолонку(Массив, "Сумма");
	Сумма = ТЗ.Итог("Сумма");
	
	Возврат Сумма;
КонецФункции

Функция Минимум(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	
	УпорядочитьМассив(Массив);
	
	Возврат Массив[0];
КонецФункции

Функция Среднее(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	
	Возврат Сумма(Массив) / Массив.Количество();
КонецФункции

Функция Максимум(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	
	УпорядочитьМассив(Массив);
	
	Возврат Массив[Массив.Количество() - 1];
КонецФункции

Функция Медиана(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	КоличествоЭлементов = Массив.Количество();
	
	Если КоличествоЭлементов = 1 Тогда
		Возврат Массив[0];
	ИначеЕсли КоличествоЭлементов = 2 Тогда
		Возврат Среднее(Массив);
	КонецЕсли;
	
	УпорядочитьМассив(Массив);
	
	Середина = КоличествоЭлементов / 2;
	
	Если Середина = Цел(Середина) Тогда
		Медиана = (Массив[Середина - 1] + Массив[Середина]) / 2;
	Иначе
		Медиана = Массив[Середина - 0.5]
	КонецЕсли;
	
	Возврат Медиана;
КонецФункции

Функция Дисперсия(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	
	Среднее = Среднее(Массив);
	
	Сумма = 0;
	
	Для каждого Значение из Массив Цикл
		Сумма = Сумма + Pow((Значение - Среднее), 2);
	КонецЦикла;
	
	Дисперсия = Сумма / Массив.Количество();//имеется ввиду генеральная дисперсия, для получения несмещённой добавить в делителе -1
	
	Возврат Дисперсия;
КонецФункции

Функция СреднеКвадратичноеОтклонение(Массив) Экспорт
	Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли;
	
	Дисперсия = Дисперсия(Массив);
	
	Возврат ?(Дисперсия < 0, 0, Sqrt(Дисперсия));
КонецФункции

Процедура УпорядочитьМассив(Массив) Экспорт
	СЗ = Новый СписокЗначений;
	СЗ.ЗагрузитьЗначения(Массив);
	СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр);
	Массив = СЗ.ВыгрузитьЗначения();
КонецПроцедуры

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

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

Функция МинимумКП(МассивПолный, МассивТекущий, ПроцентОтклонения, ВернутьКоличество = Ложь) Экспорт
	Минимум = Минимум(МассивПолный);
	ПроцентХ = Минимум / 100 * (100 + ПроцентОтклонения);
	сч = 0;
	
	Для каждого Значение из МассивТекущий Цикл
		Если Значение >= Минимум и Значение <= ПроцентХ Тогда
			Если ВернутьКоличество Тогда
				сч = сч + 1;
			Иначе
				Возврат Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Если ВернутьКоличество Тогда Возврат сч КонецЕсли;
	
	Возврат Ложь;
КонецФункции

Функция МаксимумКП(МассивПолный, МассивТекущий, ПроцентОтклонения, ВернутьКоличество = Ложь) Экспорт
	Максимум = Максимум(МассивПолный);
	ПроцентХ = Максимум / 100 * (100 - ПроцентОтклонения);
	сч = 0;
	
	Для каждого Значение из МассивТекущий Цикл
		Если Значение >= ПроцентХ и Значение <= Максимум Тогда
			Если ВернутьКоличество Тогда
				сч = сч + 1;
			Иначе
				Возврат Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Если ВернутьКоличество Тогда Возврат сч КонецЕсли;
	
	Возврат Ложь;
КонецФункции

У данных функций есть параметр ВернутьКоличество, при установке значения которого в Истина функция возвращает количество значений, попавших в диапазон, иначе вернёт булево (есть пападания/нет).

В дополнение прикладываю обработку с примером использования и возможностью поиграться. Источником данных является таблица значений. необходимые данные с отбором удобно получать при помощи функции ПолучитьМассивДанных(); 

Надеюсь, кому-то может оказаться полезным.

математика массив функции библиотека обработка среднее минимум максимум дисперсия среднеквадратичное отклонение крайнее положение вхождение в диапазон

См. также

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8847    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16156    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109

Хитрости СКД. Часть 3

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

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    9305    milkers    11    

94

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

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

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

25.04.2022    14994    quazare    11    

138

Несколько простых приемов для удобной работы в конфигураторе

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    17476    acces969    95    

148
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Caliban 133 12.01.17 09:27 Сейчас в теме
Зачем такие сложности с суммой?

Функция Сумма(Массив) Экспорт
	Cумма = 0;
	
	Для Каждого Число Из Массив Цикл
		Сумма = Сумма + Число;
	КонецЦикла;
	
	Возврат Сумма;
КонецФункции
Показать
starik-2005; Diversus; v3rter; ice-net; +4 Ответить
4. SvoyakMartin 57 12.01.17 10:16 Сейчас в теме
(1) ситуация аналогична использованию упорядочивания массива для получения крайних вместо перебора.
Несмотря на то, что логично предположить, что получение итога по колонке выполняет ту же операцию сложения в цикле, а я предлагаю дополнительно тратить время и память на создание объекта и его заполнение, по замерам производительности в моём случае выигрывает тот вариант, что я предложил.
6. ice-net 19 12.01.17 10:20 Сейчас в теме
(4)
Ладно время, а как Вы проверяли производительность по памяти?
8. SvoyakMartin 57 12.01.17 11:00 Сейчас в теме
(6) Конкретно в моём случае в приоритете была скорость выполнения отчёта. С памятью же вроде всё очевидно: создавая новую сущность с целью копирования в неё данных можно рассчитывать, что памяти придётся выделить как минимум в два раза больше(например при передаче по значению), а при использовании списка значений и тем более таблицы значений и подавно!
9. ice-net 19 12.01.17 11:09 Сейчас в теме
(8)
Я не совсем это имел ввиду)) Я хотел узнать почему в функции Сумма используется ТЗ, а не перебор по массиву как в (1)?
5. v3rter 12.01.17 10:19 Сейчас в теме
Ну если изменения в процессе вызова функции исходного массива некритичны, то да.
Хотя считаю, что сумму и минимум лучше было делать "дедовскими" способами - циклом с условием и вспомогательной переменной, как в
(1)

Идея понравилась, за идею "звездану".
10. SvoyakMartin 57 12.01.17 11:09 Сейчас в теме
(5) Изменения в исходный массив вносит только упорядочивание. Если важна сохранность не только данных, но и их индексов, тогда да, стоит озадачиться данным вопросом.
2. v3rter 12.01.17 09:58 Сейчас в теме
Мне показалось

https://its.1c.ru/db/metod8dev#content:2606:hdoc
Передача параметров по ссылке

По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.

или надо было передавать по значению?
Функция Сумма(Знач Массив) Экспорт
3. ice-net 19 12.01.17 10:14 Сейчас в теме
(2)
Знач Массив - породит новую переменную Массив (в текущем контексте), что не есть Массив - передаваемый в параметр
=> пришлось бы писать что-нибудь типа
Массив = Сумма(Массив);

Функция Сумма(Знач Массив)
.....
Возврат Массив;
КонецФункции
7. Alias 176 12.01.17 10:23 Сейчас в теме
На всякий случай напоминаю о наличии в платформе объекта
Новый АнализДанных
в котором уже есть встроенные механизмы расчёта различных параметров, в том числе максимума/минимума, медианы, среднего, стандартного отклонения и др.

Надеюсь автор сравнивал свою разработку с использованием платформенных методов и выяснил, что она работает быстрее и лучше?...
vsozansky; корум; +2 Ответить
12. SvoyakMartin 57 12.01.17 11:51 Сейчас в теме
(7) Признаюсь, с данным классом был не знаком, и при поиске способа получения дисперсии и ср.кв. отклонения средствами платформы он мне так же не попадался. На досуге озадачусь изучением сего.
(11) За сравнение - спасибо, думаю, если объединить повторяющиеся вызовы, то общее время чуть сократится.
11. Alias 176 12.01.17 11:19 Сейчас в теме
Сравнил с платформенным методом.

За счет того что платформа получает сразу несколько параметров (напомню, для типа анализа АнализДанныхОбщаяСтатистика это Количество, Максимум,
Медиана, Минимум, Размах, Среднее, СтандартноеОтклонение), время выполнения анализа платформой больше, чем каждое из вычислений с использованием приведённых функций.
Для примера:
Анализ данных платформой: 100 мс (получены 7 параметров)
Расчет приведёнными функциями: медиана - 25 мс, среднее - 80 мс, макс/мин - по 20 мс

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

Если нужно получить сразу пакет параметров -- то нужно или переделывать функции, оптимизируя получение за один проход, или всё же использовать платформенный механизм (т.к. судя по времени исполнения 100 всё же меньше чем 25+80+20+20).
Прикрепленные файлы:
Медиана.epf
13. v3rter 12.01.17 12:00 Сейчас в теме
В инженерных калькуляторах статистические функции сохраняют в памяти устройства количество элементов, сумму и сумму квадратов. Для расчета дисперсии этих данных достаточно. Я это к тому, что если надо считать ещё быстрее, то может каким-то образом сохранять или кешировать эти данные, вместе с минимумом и максимумом?
14. vasilev2015 2687 12.01.17 12:08 Сейчас в теме
Предлагаю:

рядом с медианой добавить моду ))
вместо возведения во вторую степень POW использовать умножение на себя
вместо Количество()-1 использовать ВГраница()
15. SvoyakMartin 57 12.01.17 15:00 Сейчас в теме
(14) С модой не всё так просто, что делать, если попадётся мультимодальный массив? Можно посчитать по интервальной, но какой брать интервал?

POW(x, 2) vs x * x - повторюсь, что у меня в приоритете время выполнения, в единичных случаях простое умножение выигрывает, но в среднем наоборот.

ВГраница() - согласен! На 6 символов короче запись и быстрее в среднем в 5 раз!
16. Probot1c 04.02.17 06:10 Сейчас в теме
с набором функций и обработкой данных удобно в екселе работать, хорошо что в 1с что-то подобное есть.
17. Diego_Iv 34 23.05.19 18:41 Сейчас в теме
Огромное спасибо за СреднеКвадратичноеОтклонение и Дисперсию !
Пригодилось...
18. TryToRun 22.12.21 17:24 Сейчас в теме
В расчете дисперсии ошибка, должно быть не
Дисперсия = Сумма / Массив.Количество()

а
Дисперсия = Сумма / (Массив.Количество()-1)
19. SvoyakMartin 57 22.12.21 18:22 Сейчас в теме
(18)
Дисперсия




в делителе n - общее количество элементов, так в чём же ошибка?
20. TryToRun 22.12.21 21:54 Сейчас в теме
(19) а вы сравните его с результатом, который выдаст объект АнализДанных - они не совпадут. А если исправить на n-1 получится как раз оно
21. SvoyakMartin 57 22.12.21 22:33 Сейчас в теме
(20)
подгонять под результат - так себе идея

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

подробнее:
https://statanaliz.info/statistica/opisanie-dannyx/vyborochnaya-dispersiya/
22. TryToRun 23.12.21 09:12 Сейчас в теме
(21) ну тут не совсем подгон под результат: дали задачу условно говоря "автоматизировать таблицу из excel", которую заполняют руками. Ее взял за эталон требуемого результата, в ней есть формула =СТАНДОТКЛОН.В, в описании работы которой как раз указано n-1
Прежде чем самостоятельно реализовывать решил поискать готовые решения и наткнулся на эту статью, попробовал и увидел расхождения (да, выборка небольшая - 24 элемента), в комментариях увидел стандартный объект, который в итоге выдал то же самое, что и excel. И собственно вся разница оказалась в n-1 в знаменателе дроби
Прикрепленные файлы:
23. SvoyakMartin 57 23.12.21 10:55 Сейчас в теме
(22)
добавил комментарий в статье
TryToRun; +1 Ответить
24. user683054_evgenas13 15.07.23 13:51 Сейчас в теме
Евгений программист-консультант 1С
Была задача в 1с Сделать как в Excel функция =СРОТКЛ частично взял от сюда получилось примерно так:
Функция МассивОтклоненийОтСреднего(Массив, СреднеЗначение) Экспорт
МассивВычисления = Новый Массив;
Для Каждого Стр Из Массив Цикл
Значение = Стр - СреднеЗначение;
МассивВычисления.Добавить(?(Значение > 0, Значение, -Значение));
КонецЦикла;
Возврат МассивВычисления;
КонецФункции

Процедура СРОТКЛ ()
ЗначениеСРОТКЛ = Среднее(МассивОтклоненийОтСреднего(Массив), Среднее(Массив));
КонецПроцедуры
От Excel теперь не отличается.
Оставьте свое сообщение