В исследовании моделирования мне нужно сгенерировать все различные способы создания последовательности из m чисел от 1 до n (n>m), чтобы сумма чисел была n, т.е.
nums <- c(n_1, n_2, ..., n_m)
с ограничениями
min(num) > 0 & sum(nums) == n
Другими словами: возможные разделения набора из n элементов на m различных подмножеств. Я знаю, что число таких разделов — это «число Стирлинга второго рода», что делает это невозможным для больших n, но оно мне понадобится для малых n.
Обратите внимание, что это другая задача, чем поиск всех перестановок, ответ на который в этой теме. Вместо этого речь идет о разделении.
Пакет combinat
не предоставляет для этого функции, но предложение @felix-jassler работает. Впоследствии я могу отфильтровать столбцы, содержащие нули, проиндексировав их с помощью colSums(part==0) == 0
.
@cdalitz Только что добавил ответ, если min(num) > 0
можно поставить include.zero=FALSE
:)
Из пакета разделов ( GitHub), partitions::compositions(n, m, include.zero)
должно помочь. Здесь n
будет обозначать сумму каждого вектора, m
количество элементов этого вектора, а include.zero=FALSE
гарантирует отсутствие нулей.
partitions::compositions(n=5, m=2, include.zero=FALSE) |> t()
# [1,] 4 1
# [2,] 3 2
# [3,] 2 3
# [4,] 1 4
Пакет разделов поможет ли
partitions::compositions(5)
вам? (похожие функции можно найти на странице GitHub)