问题描述
我想创建一个矩阵,每列必须有一个元素复制 n-1 次,就像我下面的代码一样。但我想避免矩阵构造中的所有这些 rep 函数。有没有更简单的方法?>
p1 = c(1,0.75,0.7,0.65,0.55,0.5,0.3);p1
d = length(p1)
m1 = matrix(c(rep(1,d),rep(0.75,rep(0.7,rep(0.65,rep(0.55,rep(0.5,rep(0.3,d)),d,d)
for (i in 1:(nrow(m1)-1)) {
for (j in (i+1):ncol(m1)) {
m1[i,j] = 0
}
}
m1
解决方法
对于构造 matrix
一个更简单的选项是
m1 <- matrix(p1,d,byrow = TRUE)
或使用 rep
m1 <- do.call(rbind,rep(list(p1),d))
或使用 replicate
m1 <- t(replicate(d,p1))
可以用 for
中的 upper.tri
替换 base R
循环以返回逻辑 vector
并将这些元素分配给 0
m2 <- data.table::copy(m1)
m2[upper.tri(m2,diag = FALSE)] <- 0
-使用 OP 的输出进行测试
identical(m1,m2)
#[1] TRUE