【问题标题】:Create a symmetric matrix from circular shifts of a vector从向量的循环移位创建对称矩阵
【发布时间】:2020-05-26 23:10:52
【问题描述】:

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

假设一个向量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,我很感激。

标签: r matrix symmetric


【解决方案1】:

让我回答我自己的问题以便正确关闭它,使用 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"

【讨论】:

    【解决方案2】:

    另一种选择是使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多