Использование
m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
1) Обратные строки, как показано (или столбцы - не показаны) , Взять диагональную и сумму:
sum(diag(m[nrow(m):1, ]))
## [1] 4
2) или использовать row
и col
вроде этого:
sum(m[c(row(m) + col(m) - nrow(m) == 1)])
## [1] 4
Это обобщается на другие анти-диагоналей, поскольку row(m) + col(m) - nrow(m)
является Contant по всем анти-диагоналей. Для такого обобщения было бы удобнее записать часть в пределах c(...)
как row(m) + col(m) - nrow(m) - 1 == 0
, так как тогда замена 0 на -1 использует сверхдиагональную и с +1 использует поддиагональную. -2 и 2 используют вторую сверхдиагональную и поддиагональную соответственно и так далее.
3) или использовать эту последовательность индексов:
n <- nrow(m)
sum(m[seq(n, by = n-1, length = n)])
## [1] 4
4) или использовать outer
как это:
n <- nrow(m)
sum(m[!c(outer(1:n, n:1, "-"))])
## [1] 4
Этот обобщает красиво с другими анти-диагоналей тоже, как outer(1:n, n:1, "-")
постоянна вдоль антидиагоналей. Мы можем записать часть в [...] как outer(1:n, n:1) == 0
, и если мы заменим 0 на -1, получим супер-антидиагональную и с +1 мы получим субдиагональную. -2 и 2 дают супер супер и суб-антидиагонали. Например, sum(m[c(outer(1:n, n:1, "-") == 1)])
- это сумма поддиапазона.
Это называется "вторичным" или "незначительные" диагонали. – Benjamin