Ответ 1
Использование
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)
является постоянным по всем антидиагоналам. Для такого обобщения было бы удобнее записать деталь в 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)])
является суммой субдиагонализы.