我想生成一个大小为n-1 xn的矩阵,以便第i列包含从1到n的所有数字,而不包含i,即第一列应该包含2到n的所有数字,第二列应该包含1,3,4,...,第三个应包含1,2,4,...,依此类推。 任何想法都将受到欢迎。
答案 0 :(得分:5)
使用./sdkmanager --licenses
(虽然不是真正随机的)。
combn
如有必要,请对每一列进行洗牌
n <- 5
out <- combn(n:1, n - 1)
out
# [,1] [,2] [,3] [,4] [,5]
#[1,] 5 5 5 5 4
#[2,] 4 4 4 3 3
#[3,] 3 3 2 2 2
#[4,] 2 1 1 1 1
如果您要提高效率,请使用我发布的解决方案;)
set.seed(1)
apply(combn(n:1, n - 1), 2, sample)
library(microbenchmark)
n <- 1000
set.seed(1)
benchmark <- microbenchmark(
akrun = vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1)),
markus = apply(combn(n:1, n - 1), 2, sample),
A_Stam = create_matrix(n),
times = 30L
)
答案 1 :(得分:3)
我们遍历序列'n',获得序列的sample
,除了循环数(setdiff
)
sapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)))
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 2 3 1 3 2 2
#[2,] 5 1 5 6 1 5
#[3,] 6 4 6 2 3 4
#[4,] 3 5 4 1 4 1
#[5,] 4 6 2 5 6 3
如果我们使用vapply
vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1))
注意:OP在帖子中提到了random
矩阵
n <- 6
答案 2 :(得分:2)
这可能不是最优雅的解决方案,但它可以起作用:
create_matrix <- function(n) {
m <- c()
for (i in 1:n) {
new <- setdiff(1:n, i)
m <- c(m, new)
}
matrix(m, ncol = n, byrow = FALSE)
}
create_matrix(4)
#> [,1] [,2] [,3] [,4]
#> [1,] 2 1 1 1
#> [2,] 3 3 2 2
#> [3,] 4 4 4 3