如何仅使用 for 循环创建这个精确的 5x5 矩阵?
How can I create this exact 5x5 matrix using only for loops?
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
所以我得到了这个矩阵,并被告知只使用 for 循环创建它。到目前为止我所做的是使用 cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4))
但我无法找到使用 for 函数的方法。
试试这个:
a = matrix(1:25, nrow=5, ncol=5)
for (i in 1:5) {
for (j in 1:5) {
a[i][j] = (i-1) + (j-1)
}
}
print(a)
您可以先创建一个空矩阵,然后用遍历行和列的两个 for 循环填充它。稍微尝试一下变量以写入矩阵 (count
) 我发现这是一个合适的解决方案。
matrix2fill <- matrix(NA, 5,5)
count = 0
for (i in 1:5){
for (j in 1:5){
matrix2fill[j,i] = count
count = count + 1
}
count = i
}
matrix2fill
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8
你走在正确的轨道上。如果你重写你当前的
cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4))
为
cbind(0+(0:4),1+(0:4),2+(0:4),3+(0:4),4+(0:4))
您可能会注意到,您添加到 0:4
的内容隐式地是一个循环索引。
明确说明:
m = c()
for(i in 0:4){
m = cbind(m,i+(0:4))
}
print(m)
输出:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8
一种方式:
mat <- matrix(0L, nrow=5, ncol=5)
for (i in 0:4) {
for (j in 0:4) {
mat[i + 1, j + 1] <- i + j
}
}
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 1 2 3 4
# [2,] 1 2 3 4 5
# [3,] 2 3 4 5 6
# [4,] 3 4 5 6 7
# [5,] 4 5 6 7 8
技术上 *apply 函数也是循环:
sapply(0:4, \(x) 0:4 + x)
另一种方式:
mymat <- matrix(NA, nrow = 5, ncol = 5)
i_mat <- 1
for (i in 0:4) {
mymat[seq(i_mat, i_mat + 4)] <- seq(i, i + 4)
i_mat <- i_mat + 5
}
mymat
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
所以我得到了这个矩阵,并被告知只使用 for 循环创建它。到目前为止我所做的是使用 cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4))
但我无法找到使用 for 函数的方法。
试试这个:
a = matrix(1:25, nrow=5, ncol=5)
for (i in 1:5) {
for (j in 1:5) {
a[i][j] = (i-1) + (j-1)
}
}
print(a)
您可以先创建一个空矩阵,然后用遍历行和列的两个 for 循环填充它。稍微尝试一下变量以写入矩阵 (count
) 我发现这是一个合适的解决方案。
matrix2fill <- matrix(NA, 5,5)
count = 0
for (i in 1:5){
for (j in 1:5){
matrix2fill[j,i] = count
count = count + 1
}
count = i
}
matrix2fill
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8
你走在正确的轨道上。如果你重写你当前的
cbind(0:4,1+(0:4),2+(0:4),3+(0:4),4+(0:4))
为
cbind(0+(0:4),1+(0:4),2+(0:4),3+(0:4),4+(0:4))
您可能会注意到,您添加到 0:4
的内容隐式地是一个循环索引。
明确说明:
m = c()
for(i in 0:4){
m = cbind(m,i+(0:4))
}
print(m)
输出:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8
一种方式:
mat <- matrix(0L, nrow=5, ncol=5)
for (i in 0:4) {
for (j in 0:4) {
mat[i + 1, j + 1] <- i + j
}
}
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 1 2 3 4
# [2,] 1 2 3 4 5
# [3,] 2 3 4 5 6
# [4,] 3 4 5 6 7
# [5,] 4 5 6 7 8
技术上 *apply 函数也是循环:
sapply(0:4, \(x) 0:4 + x)
另一种方式:
mymat <- matrix(NA, nrow = 5, ncol = 5)
i_mat <- 1
for (i in 0:4) {
mymat[seq(i_mat, i_mat + 4)] <- seq(i, i + 4)
i_mat <- i_mat + 5
}
mymat
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
[2,] 1 2 3 4 5
[3,] 2 3 4 5 6
[4,] 3 4 5 6 7
[5,] 4 5 6 7 8