2015-11-10 14 views
12

Sto cercando di sommare gli elementi lungo la diagonale (diagonale secondaria, diagonale minore) di una matrice.Somma di antidiagonale di una matrice

Quindi, se ho una matrice 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 

Sto cercando la somma m[3, 1] + m[2, 2] + m[1, 3], vale a dire 1 + 2 + 1

non riesco a capire come impostare un'iterazione. Per quanto ne so non c'è alcuna funzione per questo (come diag() per l'altra diagonale).

+2

Questo è chiamato il "secondario" o "minore" diagonale. – Benjamin

risposta

15

Utilizzando

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

1) Invertire le righe come mostrato (o le colonne - non visualizzate) , Prendere la somma diagonale e:

sum(diag(m[nrow(m):1, ])) 
## [1] 4 

2) oppure utilizzare row e col simili:

sum(m[c(row(m) + col(m) - nrow(m) == 1)]) 
## [1] 4 

Questo generalizza ad altri anti-diagonali poiché row(m) + col(m) - nrow(m) è contant lungo tutti gli anti-diagonali. Per una tale generalizzazione potrebbe essere più conveniente scrivere la parte entro c(...) come row(m) + col(m) - nrow(m) - 1 == 0, poiché la sostituzione di 0 con -1 utilizza la superdiagonale e con +1 utilizza la controdiagonale. -2 e 2 usano rispettivamente il secondo superdiagonale e il subdiagonale e così via.

3) oppure utilizzare questa sequenza di indici:

n <- nrow(m) 
sum(m[seq(n, by = n-1, length = n)]) 
## [1] 4 

4) oppure utilizzare outer simili:

n <- nrow(m) 
sum(m[!c(outer(1:n, n:1, "-"))]) 
## [1] 4 

Questo generalizza bene ad altri anti-diagonali anche come outer(1:n, n:1, "-") è costante lungo le anti-diagonali. Possiamo scrivere la parte entro [...] come outer(1:n, n:1) == 0 e se sostituiamo 0 con -1 otteniamo il super anti-diagonale e con +1 otteniamo il sub anti-diagonale. -2 e 2 danno i super super e sub sub antidiagonali. Ad esempio sum(m[c(outer(1:n, n:1, "-") == 1)]) è la somma del sub anti-diagonale.

+0

Grazie per questo. Alcune delle sintassi sono al di fuori di me quindi ho bisogno di elaborare esempi dettagliati e dettagliati. – Windstorm1981

4

Si potrebbe indice gli elementi che si desidera sommare

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

Grazie. Questo è in realtà ciò che stavo immaginando ma non riuscivo a capire come scriverlo. Stavo armeggiando con un ciclo annidato "per" che ovviamente non mi dava quello che volevo. – Windstorm1981

2

Ecco un modo semplice senza l'utilizzo di un ciclo, partendo dal presupposto che il vostro matrice è m:

sum(diag(matrix(c(m[,3],m[,2],m[,1]), nrow=3))) 
+0

Grazie.Questo è molto semplice e intuitivo. – Windstorm1981

2

Questo è talvolta chiamato "diagonale secondaria" o "diagonale minore".

Un'altra soluzione abbreviata:

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