Я хочу написать класс, представляющий цепь Маркова (назовем его MC
). У него есть конструктор, который принимает матрицу перехода состояний (то есть vector<vector<double>>
. Я полагаю, неплохо проверить, действительно ли это матрица (имеет одинаковое количество строк и столбцов) и действительно является матрицей перехода: все числа в нем являются вероятностями, то есть не меньше 0.0
и не больше 1.0
, и для каждой строки сумма ее элементов равна 1.0
.Однако есть проблема, возникающая из-за ограничений с плавающей запятой: например, сумма 0.3 + 0.3 + 0.3 + 0.1
не будет равно 1.0
, так что проверить будет не так просто, поэтому я вижу два возможных решения этой проблемы:
- Выберите какой-нибудь эпсилон и сравните с ошибкой эпсилон. Конечно, теперь он будет принимать некоторые матрицы, нарушающие свойство матрицы перехода, но в целом, если кто-то случайно передаст в конструктор какие-то неверные данные, он получит исключение.
- Ничего не проверяйте, полагайтесь на пользователя класса, если он пропустит что-то плохое, это полностью его вина, и поведение класса будет неожиданным.
Какой подход лучше и более «реалистичен»? Мне нравится первый, но опять же, не знаю, как мне выбрать эпсилон.
1.0
. В популярных библиотеках есть прецеденты, например. функции, которые принимают массив вероятностейa
и нормализуют каждый элемент массива, чтобы он был равенa[i]/sum(a)
, чтобы иметь дело со случаем, когда элементыa
не добавляются к1.0
. - person Simon   schedule 13.04.2013