Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从向量的循环移位创建对称矩阵_R_Matrix_Symmetric - Fatal编程技术网

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