创建给定长度的所有多重索引

Creating all multi indices of given length

给定一个整数 K 和一个维度 d,我如何在 R 中获得所有具有 length(alpha) = dsum(alpha) = K 的多索引 alpha

示例:对于 K=3d=2,如果我们将多个索引组织在一个列表 alphas 中,我们将得到

alphas[[1]] = c(3,0)
alphas[[2]] = c(2,1)
alphas[[3]] = c(1,2)
alphas[[4]] = c(0,3)

根据描述,我们可以在从'0'到'k'的序列上使用expand.grid,在rep连接list 'd'之后次,然后 Filter 只有具有 sum 作为 'k'

的行
f1 <- function(k, d) { 
 lapply(Filter(function(x) sum(x) == k, 
      asplit(expand.grid(rep(list(0:k), d)), 1)), unname)

}

-测试

> f1(3, 2)
[[1]]
[1] 3 0

[[2]]
[1] 2 1

[[3]]
[1] 1 2

[[4]]
[1] 0 3

或者使用 rowSums

进行过滤会稍微快一些
d1 <- expand.grid(rep(list(0:3), 2))
asplit(unname(d1)[rowSums(d1) == 3,], 1)

RcppAlgos

中还有一个基于约束的组合函数
f2 <- function(k, d) {

 out <- RcppAlgos::comboGeneral(0:k, d, constraintFun = "sum", 
      comparisonFun = "==", limitConstraints = k)
 asplit(rbind(out, out[, ncol(out):1]), 1)

}

-测试

> f2(3, 2)
[[1]]
[1] 0 3

[[2]]
[1] 1 2

[[3]]
[1] 3 0

[[4]]
[1] 2 1

或者正如@JosephWood 提到的那样,permuteGeneralcomboGeneral

更合适
k <- 3
d <- 2
permuteGeneral(0:k, d, TRUE, constraintFun = "sum",
  comparisonFun = "==", limitConstraints = k)

compositions

library(partitions)
asplit(compositions(k, d), 2)