gpt4 book ai didi

r - 大小为 K 的整数分区

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:39 24 4
gpt4 key购买 nike

给定 F 非负整数的向量 v,我想一个一个地创建所有可能的 K 向量集大小为 F,总和为 v。我称 C 为这 K 个向量的矩阵; C 的行和给出 v

例如,大小为 F=2 的向量 (1,2),如果我们设置 K=2,则可以分解为:

# all sets of K vectors such that their sum is (1,2)
C_1 = 1,0 C_2 = 1,0 C_3 = 1,0 C_4 = 0,1 C_5 = 0,1 C_6 = 0,1
2,0 1,1 0,2 2,0 1,1 0,2

目标是对每个可能的 C 应用一些函数。目前,我使用这段代码,我在其中预先计算所有可能的 C,然后遍历它们。

library(partitions)
K <- 3
F <- 5
v <- 1:F

partitions <- list()
for(f in 1:F){
partitions[[f]] <- compositions(n=v[f],m=K)
}

# Each v[f] has multiple partitions. Now we create an index to consider
# all possible combinations of partitions for the whole vector v.
npartitions <- sapply(partitions, ncol)
indices <- lapply(npartitions, function(x) 1:x)
grid <- as.matrix(do.call(expand.grid, indices)) # breaks if too big

for(n in 1:nrow(grid)){
selected <- c(grid[n,])
C <- t(sapply(1:F, function(f) partitions[[f]][,selected[f]]))

# Do something with C
#...
print(C)
}

但是,当维度太大时,F、K 很大,那么组合的数量就会爆炸,expand.grid 无法处理。

我知道,对于给定的位置 v[f],我可以一次创建一个分区

partition <- firstcomposition(n=v[f],m=K)
nextcomposition(partition, v[f],m=K)

但是我怎样才能像上面的代码那样使用它来生成所有可能的 C 呢?

最佳答案

npartitions <- ......
indices <- lapply(npartitions, function(x) 1:x)
grid <- as.matrix(do.call(expand.grid, indices))

由于 Cantor expansion,您可以避免生成 grid 并连续生成其行.

这是返回整数 n 的 Cantor 展开的函数:

aryExpansion <- function(n, sizes){
l <- c(1, cumprod(sizes))
nmax <- tail(l,1)-1
if(n > nmax){
stop(sprintf("n cannot exceed %d", nmax))
}
epsilon <- numeric(length(sizes))
while(n>0){
k <- which.min(l<=n)
e <- floor(n/l[k-1])
epsilon[k-1] <- e
n <- n-e*l[k-1]
}
return(epsilon)
}

例如:

expand.grid(1:2, 1:3)
## Var1 Var2
## 1 1 1
## 2 2 1
## 3 1 2
## 4 2 2
## 5 1 3
## 6 2 3
aryExpansion(0, sizes = c(2,3)) + 1
## [1] 1 1
aryExpansion(1, sizes = c(2,3)) + 1
## [1] 2 1
aryExpansion(2, sizes = c(2,3)) + 1
## [1] 1 2
aryExpansion(3, sizes = c(2,3)) + 1
## [1] 2 2
aryExpansion(4, sizes = c(2,3)) + 1
## [1] 1 3
aryExpansion(5, sizes = c(2,3)) + 1
## [1] 2 3

因此,不是生成网格:

npartitions <- ......
indices <- lapply(npartitions, function(x) 1:x)
grid <- as.matrix(do.call(expand.grid, indices))
for(n in 1:nrow(grid)){
selected <- grid[n,]
......
}

你可以这样做:

npartitions <- ......
for(n in seq_len(prod(npartitions))){
selected <- 1 + aryExpansion(n-1, sizes = npartitions)
......
}

关于r - 大小为 K 的整数分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48354716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com