我是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
}
}
}
任何人都可以提供帮助吗?
感谢
答案 0 :(得分:4)
通过将矩阵存储到列表中来尝试此操作。
serviceId
输出 -
@FeignClient(value = "helloworldservice", serviceId = "dev")
public interface MyBigFatHelloWorldServiceProxy{ ... }
答案 1 :(得分:2)
您应该将矩阵存储在列表中。现在,每次循环迭代时,你只需要写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
答案 2 :(得分:0)
考虑lapply建立一个返回项目列表:
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