从向量的循环移位创建对称矩阵
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
我正在努力创建对称矩阵。
假设一个向量 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