我刚接触R编程,想要用循环创建n矩阵。
我已经写好了一个循环来创建3个矩阵,但是不知道如何保存这些矩阵。
n=numeric(0)
for (i in 1:3){
n[i]=5^i
m=numeric(0)
m=matrix(data=0,nrow=n[i],ncol=n[i])
for (j in n[i]:1){
for (k in 1:i){
m[j,k]=j+k
}
}
}
有人能帮忙吗?
谢谢
n=numeric(0)
list_mat <- list()
for (i in 1:3){
n[i]=5^i
m=numeric(0)
m=matrix(data=0,nrow=n[i],ncol=n[i])
for (j in n[i]:1){
for (k in 1:i){
m[j,k]=j+k
}
}
list_mat[[i]] <- m #Holding Matrix
}
输出-
> list_mat[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 2 0 0 0 0
[2,] 3 0 0 0 0
[3,] 4 0 0 0 0
[4,] 5 0 0 0 0
[5,] 6 0 0 0 0
你应该将矩阵存储在列表中。现在,每次循环迭代时,你只是覆盖了m
。
n = numeric(0)
out = list()
for (i in 1:3){
n[i]=5^i
m=numeric(0)
m=matrix(data=0,nrow=n[i],ncol=n[i])
for (j in n[i]:1){
for (k in 1:i){
m[j,k]=j+k
}
}
out[[i]] <- m
}
lapply
构建列表,而不是嵌套使用for循环。就像这样:out_apply <- lapply(1:3, function(i) {
m <- t(t(matrix(rep(1:5^i, i), ncol = i)) + 1:i)
cbind(m, matrix(data = 0, nrow = 5^i, ncol = 5^i - i))
})
all.equal(out, out_apply)
[1] TRUE
matrix_list <- lapply(1:3, function(i) {
n <- 5^i
m <- matrix(data=0, nrow=n, ncol=n)
for (j in n:1){
for (k in 1:i){
m[j,k]=j+k
}
}
return(m)
})
sapply
构建矩阵列表,传递多个向量,这通常是嵌套的for
循环的对应方法。要添加零矩阵,请使用cbind
:matrix_list2 <- lapply(1:3, function(i) {
n <- 5^i
m <- matrix(data=0, nrow=n, ncol=n-i)
s <- as.matrix(sapply(1:n, `+`, 1:i))
if (i == 1) m <- cbind(s, m)
else m <- cbind(t(s), m)
})
或者更加紧凑,使用 outer
,在两个 for
循环向量的边缘运行:
matrix_list3 <- lapply(1:3, function(i) {
n = 5^i
m <- matrix(data=0, nrow=n, ncol=n-i)
m <- cbind(outer(1:n, 1:i, `+`), m)
})
all.equal(matrix_list, matrix_list2)
# [1] TRUE
all.equal(matrix_list, matrix_list3)
# [1] TRUE