Сумма антидиагональности матрицы

Я пытаюсь сложить элементы вдоль антидиагональной (вторичная диагональ, малая диагональ) матрицы.

Итак, если у меня есть матрица m:

m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
m

     [,1] [,2] [,3]
[1,]    2    4    1
[2,]    3    2    3
[3,]    1    5    7

Я ищу сумму m[3, 1] + m[2, 2] + m[1, 3]т.е. 1 + 2 + 1

Я не могу понять, как настроить итерацию. Насколько я знаю, нет функции для этого (как diag() для другой диагонали).

5 ответов

Решение

С помощью

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)]) это сумма суб-анти-диагонали.

Это иногда называют "вторичной диагональю" или "малой диагональю".

Еще одно короткое решение:

sum(diag(apply(m,2,rev)))

Вы можете проиндексировать элементы, которые вы хотите суммировать

sum(m[cbind(3:1, 1:3)])

Вот простой способ без использования цикла, предполагая, что ваша матрица m:

sum(diag(matrix(c(m[,3],m[,2],m[,1]), nrow=3)))
      # setup
m <- matrix(c(2, 3, 1, 4, 2, 5, 1, 3, 7), 3)
n <- nrow(m)

# solution
diag(diag(m[n:1,]))[n:1,]
Другие вопросы по тегам