用嵌套的for循环创建矩阵

时间:2020-02-09 20:36:01

标签: r function for-loop matrix nested-loops

这是准备考试的练习题。我得到以下代码:

     W=matrix(1:16,byrow=T,ncol=4)
print(W)

fmat=function(W){
n=nrow(W)

      for (i in 1:n){
      for (j in 1:n){
        W[j,i]=W[i,j]+W[j,i]
      }
      }

      return(W)
}

print(fmat(W))

我们必须在纸上“运行”代码,然后通过在R中运行代码来检查答案。我为W写下了正确的矩阵,但我错了fmat(W)。 R为我提供了fmat(W)的以下输出:

     [,1] [,2] [,3] [,4]
[1,]    2    9   15   21
[2,]    7   12   24   30
[3,]   12   17   22   39
[4,]   17   22   27   32

我写下的fmat(W)等于:

     [,1] [,2] [,3] [,4]
[1,]    2    7   12   17
[2,]    7   12   17   22
[3,]   12   17   22   27
[4,]   17   22   27   32

这到底是怎么回事?我已经解释了要计算的函数,例如w [2,1] = w [1,2] + w [2,1],即2 + 5 = 7。

1 个答案:

答案 0 :(得分:0)

在您的代码中,W在嵌套的for循环中被列然后被行覆盖。

要显示进度,您可以在分配值print(W)之前添加W[j,i] = W[i,j]+W[j,i],即

fmat=function(W){
  n=nrow(W)
  for (i in 1:n){
    for (j in 1:n){
      print(W)
      W[j,i]=W[i,j]+W[j,i]
    }
  }
  return(W)
}

这样

> fmat(W)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    2    3    4
[2,]    7    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    2    3    4
[2,]    7    6    7    8
[3,]   12   10   11   12
[4,]   13   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    2    3    4
[2,]    7    6    7    8
[3,]   12   10   11   12
[4,]   17   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9    3    4
[2,]    7    6    7    8
[3,]   12   10   11   12
[4,]   17   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9    3    4
[2,]    7   12    7    8
[3,]   12   10   11   12
[4,]   17   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9    3    4
[2,]    7   12    7    8
[3,]   12   17   11   12
[4,]   17   14   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9    3    4
[2,]    7   12    7    8
[3,]   12   17   11   12
[4,]   17   22   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15    4
[2,]    7   12    7    8
[3,]   12   17   11   12
[4,]   17   22   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15    4
[2,]    7   12   24    8
[3,]   12   17   11   12
[4,]   17   22   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15    4
[2,]    7   12   24    8
[3,]   12   17   22   12
[4,]   17   22   15   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15    4
[2,]    7   12   24    8
[3,]   12   17   22   12
[4,]   17   22   27   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15   21
[2,]    7   12   24    8
[3,]   12   17   22   12
[4,]   17   22   27   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15   21
[2,]    7   12   24   30
[3,]   12   17   22   12
[4,]   17   22   27   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15   21
[2,]    7   12   24   30
[3,]   12   17   22   39
[4,]   17   22   27   16
     [,1] [,2] [,3] [,4]
[1,]    2    9   15   21
[2,]    7   12   24   30
[3,]   12   17   22   39
[4,]   17   22   27   32