从矢量制作对称矩阵

Make symmetric matrix from vector

我必须将向量转换成矩阵

x<-c(1:5)
mat<-matrix(nrow=3, ncol=3)
for (i in 1:3){
  for (j in 1:3){
    if (i==j) {
      mat[i,j]<-x[3]
    } else 
      if (i < j) { ##for upper diagonal
        mat[i,j]<-x[j]
      }
  }
}

结果矩阵应为

    [,1]  [,2] [,3]
[1,] 1      2    3
[2,] 4      1    2
[3,] 5      4    1

我知道它是一种 toeplitz 矩阵并且在 R 中有可用的包,但我必须使用嵌套的 for 循环来做到这一点。

这可以用 toeplitz 完成,函数来自 base R 即不需要包

 `diag<-`(toeplitz(x)[-(2:3), 1:3], 1)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    1    2
[3,]    5    4    1

关于嵌套循环,一个选项是

x <- c(1:5)
mat <- matrix(nrow=3, ncol=3)
for (i in 1:3){
  for (j in 1:3){
    if (i==j) {
      mat[i,j]<-x[1]
    } else if (i > j) { 
         if((i + j) < length(x)){
            mat[i,j] <- x[(i + j + 1)]
         } else {
            mat[i, j] <- x[(i + j) - 1]
         }  
      } else {
          if((i + j) < length(x)) {
           mat[i, j] <- x[j]
          } else {
            mat[i, j] <- x[i]
          }
              }
  }
}

-输出

> mat
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    1    2
[3,]    5    4    1