创建给定长度的所有多重索引
Creating all multi indices of given length
给定一个整数 K
和一个维度 d
,我如何在 R 中获得所有具有 length(alpha) = d
和 sum(alpha) = K
的多索引 alpha
?
示例:对于 K=3
和 d=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 提到的那样,permuteGeneral
比 comboGeneral
更合适
k <- 3
d <- 2
permuteGeneral(0:k, d, TRUE, constraintFun = "sum",
comparisonFun = "==", limitConstraints = k)
或 compositions
library(partitions)
asplit(compositions(k, d), 2)
给定一个整数 K
和一个维度 d
,我如何在 R 中获得所有具有 length(alpha) = d
和 sum(alpha) = K
的多索引 alpha
?
示例:对于 K=3
和 d=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 提到的那样,permuteGeneral
比 comboGeneral
k <- 3
d <- 2
permuteGeneral(0:k, d, TRUE, constraintFun = "sum",
comparisonFun = "==", limitConstraints = k)
或 compositions
library(partitions)
asplit(compositions(k, d), 2)