Создайте матрицу symri c из круговых сдвигов вектора - PullRequest
4 голосов
/ 27 мая 2020

Я борюсь с созданием симметричной c матрицы.

Скажем, вектор 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 матрица с диагональю c(1,3,2) (отличается от вектора v), и ручной процесс создания матрицы будет таким:

![![enter image description here

Используя первую строку в качестве основы (вектор v), процесс заключается в заполнении пустых пространств оставшимися значениями с левой стороны.

Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Позвольте мне ответить на свой вопрос, чтобы закрыть его должным образом, используя невероятно простое и легкое решение из комментария Хенрика :

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"
0 голосов
/ 27 мая 2020

Другой вариант - использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...