从向量的循环移位创建对称矩阵

Create a symmetric matrix from circular shifts of a vector

我正在努力创建对称矩阵。

假设一个向量 v <- c(1,2,3)

我想创建这样的矩阵:

matrix(ncol = 3, nrow = 3, c(1,2,3,2,3,1,3,1,2), byrow = FALSE)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    1
[3,]    3    1    2

(这只是一个代表,我有很多不同长度的向量。)

请注意,这是一个具有对角线 c(1,3,2) 的对称矩阵(不同于向量 v),创建矩阵的手动过程如下:

使用第一行作为基础(向量v),该过程是用左侧的剩余值填充空白区域。

感谢任何帮助。谢谢!

让我回答我自己的问题,以便正确关闭它,使用来自 Henrik 的评论:

的令人难以置信的简单易行的解决方案
matrix(v, nrow = 3, ncol = 4, byrow = TRUE)[ , 1:3]

也许 byrow = TRUE 在概念上最符合图示的三个步骤,但输出与:

相同
matrix(v, nrow = 4, ncol = 3)[1:3, ]
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    3    1
# [3,]    3    1    2

因为可能有“许多不同长度的向量”,制作一个简单的函数并将其应用于存储在list中的向量可能很方便:

cycle = function(x){
  len = length(x)
  matrix(x, nrow = len + 1, ncol = len)[1:len , ]
}

l = list(v1 = 1:3, v2 = letters[1:4])    

lapply(l, cycle)    
# $v1
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    3    1
# [3,]    3    1    2
# 
# $v2
#     [,1] [,2] [,3] [,4]
# [1,] "a"  "b"  "c"  "d" 
# [2,] "b"  "c"  "d"  "a" 
# [3,] "c"  "d"  "a"  "b" 
# [4,] "d"  "a"  "b"  "c"

另一种选择是使用 Reduce 并使 c(v[-1], v[1]) 累加。

do.call(rbind, Reduce(function(x, y) c(x[-1], x[1]), v[-1], v, accumulate = TRUE))
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    2    3    1
#[3,]    3    1    2