Извлечение противоположно-диагональных (не внедиагональных) элементов матрицы - PullRequest
2 голосов
/ 08 октября 2019

Может быть, это слишком простой вопрос, но я не смог найти функциональный ответ. Как мы можем извлечь противоположные диагональные элементы любой квадратной матрицы в R? В приведенном ниже примере это будет: 7, 2, 8.

r <- matrix(c(1, 5, 8, 1:3, 7:9), 3)

Ответы [ 4 ]

4 голосов
/ 08 октября 2019

Подход может быть

r[(n<-nrow(r))^2-(1:n)*(n-1)]
# [1] 7 2 8

## microbenchmark (matrix(1:1e6,1000))
# Unit: microseconds
#         expr       min         lq        mean    median         uq      max neval
#  r[(n<-nr...    26.897    39.0075    65.36835    47.309    85.9345   316.97   100
#  diag(r[,... 18070.388 18905.3475 20237.09599 19956.615 20423.4695 27798.88   100
#  rev(r[ro... 14220.609 21206.7220 21238.59515 22036.275 22599.4490 33252.58   100
4 голосов
/ 08 октября 2019
diag(r[,rev(sequence(NCOL(r)))])
#OR
rev(r[row(r) == NCOL(r) - col(r) + 1])
#OR
rev(r[(row(r) + col(r)) == (nrow(r) + 1)])
#[1] 7 2 8
1 голос
/ 08 октября 2019

Мы также можем сгенерировать индекс для извлечения этих элементов

n <- nrow(r)
r[seq(n, by = n-1, length = n)]
#[1] 8 2 7

Если порядок важен, мы можем отменить извлеченные элементы.

rev(r[seq(n, by = n-1, length = n)])
#[1] 7 2 8
0 голосов
/ 09 октября 2019

Вы можете использовать подмножество матриц, например:

r[matrix(c(1:nrow(r), ncol(r):1), ncol=2)]
#[1] 7 2 8

или подмножество векторов, например

r[1:nrow(r) + (ncol(r):1-1)*nrow(r)]
#[1] 7 2 8
...