R 使用循环使用创建矩阵

R 使用循环使用创建矩阵,r,matrix,recycle,R,Matrix,Recycle,作为练习,我被要求使用回收来启动一个4×5矩阵,其中前三行为0,第四行为4、8、12、16、20 我理解循环的定义是,如果数学运算中两个向量的长度不匹配,则重复较短的向量,直到其长度与较大向量的长度匹配。我试图通过以下内容和其他内容创建一个矩阵 x = matrix(0,nrow=4,ncol=5) + c(4,8,12,16,20) 当然,这是不正确的,所以我想知道我在这里遗漏了什么。非常感谢您的帮助。如果您希望替换最后一行,请使用替换为行/列索引 replace(matrix(0,nro

作为练习,我被要求使用回收来启动一个4×5矩阵,其中前三行为0,第四行为4、8、12、16、20

我理解循环的定义是,如果数学运算中两个向量的长度不匹配,则重复较短的向量,直到其长度与较大向量的长度匹配。我试图通过以下内容和其他内容创建一个矩阵

x = matrix(0,nrow=4,ncol=5) + c(4,8,12,16,20) 

当然,这是不正确的,所以我想知道我在这里遗漏了什么。非常感谢您的帮助。

如果您希望
替换最后一行,请使用
替换为行/列索引

replace(matrix(0,nrow=4,ncol=5), cbind(4, 1:5), c(4,8,12,16,20))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    0    0    0    0    0
#[3,]    0    0    0    0    0
#[4,]    4    8   12   16   20

还是做作业

m1 <- matrix(0,nrow=4,ncol=5)
m1[nrow(m1),] <- c(4,8,12,16,20)

或者另一个选项是将循环的逻辑向量与
rep
复杂的值向量相乘,将值更改为0,然后构造
矩阵

matrix(rep(c(4, 8, 12, 16, 20), each = 4) * c(FALSE, FALSE, FALSE, TRUE), 4, 5)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    0    0    0    0    0
#[3,]    0    0    0    0    0
#[4,]    4    8   12   16   20

在向量参数上调用时,
rbind
返回一个矩阵并循环使用太短的向量,从而形成一个简单而优雅的解决方案:

rbind(0, 0, 0, c(4, 8, 12, 16, 20))

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    0    0    0    0
# [2,]    0    0    0    0    0
# [3,]    0    0    0    0    0
# [4,]    4    8   12   16   20
使用模(
%%
):


写得更一般一些:

nr = 4
nc = 5
v = seq(nr * nc)
matrix(v * (v %% nr == 0), nrow = nr)

下面是另一个使用矩阵与向量相乘的版本:

matrix(rep(c(0,0,0,1),5),ncol=5)* c(16,12,8,4,20)


     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    8   12   16   20
…还有另一个版本:

t(matrix(c(rep(0,15),rep(1,5)),ncol=4) * c(4,8,12,16,20))


     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    8   12   16   20

有没有一种方法可以使用循环和仅使用矩阵()函数?
matrix(1:20*(1:20%%4==0),nrow=4)
matrix(rep(c(0,0,0,1),5),ncol=5)* c(16,12,8,4,20)


     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    8   12   16   20
t(matrix(c(rep(0,15),rep(1,5)),ncol=4) * c(4,8,12,16,20))


     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    4    8   12   16   20