【发布时间】:2017-01-30 21:31:43
【问题描述】:
我想生成一个 nxm 矩阵。假设它是 100x3。我希望每一行总和为 1(所以两个“0”和一个“1”)。
sample(c(0,0,1),3)
会给我 1 行,但有没有一种非常快速的方法可以在没有 rbind 的情况下生成整个矩阵?
谢谢!
【问题讨论】:
-
t(replicate(100,sample(c(0,0,1))))
标签: r
我想生成一个 nxm 矩阵。假设它是 100x3。我希望每一行总和为 1(所以两个“0”和一个“1”)。
sample(c(0,0,1),3)
会给我 1 行,但有没有一种非常快速的方法可以在没有 rbind 的情况下生成整个矩阵?
谢谢!
【问题讨论】:
t(replicate(100,sample(c(0,0,1))))
标签: r
没有循环,没有换位。只需创建一个零矩阵,并通过对行进行采样将每行的一个条目替换为 1。
m <- matrix(0, 100, 3)
nr <- nrow(m)
m[cbind(1:nr, sample(ncol(m), nr, TRUE))] <- 1
all(rowSums(m) == 1)
# [1] TRUE
【讨论】:
mat <- matrix(runif(300),ncol=3)
mat[] <- as.numeric(t(apply(mat, 1, function(r) r == max(r))))
【讨论】:
t(apply(t(matrix(rep(c(0,0,1),300),nrow = 3)), 1, function(x) sample(x)))
【讨论】:
由于您希望一行有一个 1,因此可以重述该问题以随机选择每行有 1 的列条目。
所以你可以这样做,
m <- 3; n<-100
rand_v <- floor(runif(n)*3)+1
mat <- matrix(0,n,m)
idx <- cbind(1:n,rand_v)
mat[idx] <- 1
希望这会有所帮助。
【讨论】: