R 从向量的循环移位创建对称矩阵
我正在努力创建一个对称矩阵R 从向量的循环移位创建对称矩阵,r,matrix,symmetric,R,Matrix,Symmetric,我正在努力创建一个对称矩阵 让我们假设一个向量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,]
让我们假设一个向量
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
因为可能有“许多不同长度的向量”,所以可以方便地创建一个简单的函数,并将其应用于存储在列表中的向量:
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
非常感谢您提供了一个漂亮的示例!谢谢@Henrik,我很感激。
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