2015-11-10 5 views
12

Ich versuche, die Elemente entlang der Antidiagonale (sekundäre Diagonale, kleine Diagonale) einer Matrix zu summieren.Summe der Antidiagonale einer Matrix

Also, wenn ich eine Matrix 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 

Ich suche die Summe m[3, 1] + m[2, 2] + m[1, 3], das heißt 1 + 2 + 1

Ich kann nicht herausfinden, wie eine Iteration einzurichten. Soweit ich weiß, gibt es dafür keine Funktion (wie diag() für die andere Diagonale).

+2

Dies ist die "sekundäre" oder "kleine" Diagonale bezeichnet. – Benjamin

Antwort

15

Mit

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

1) Die Zeilen wie gezeigt umkehren (oder die Spalten - nicht gezeigt) nehmen, die Diagonale und Summe:

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

2) oder row und col wie folgt verwenden:

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

Diese seit row(m) + col(m) - nrow(m) zu anderen anti-Diagonalen verallgemeinert entlang aller anti-Diagonalen ist contant. Für eine solche Verallgemeinerung könnte es praktischer sein, den Teil innerhalb c(...) als row(m) + col(m) - nrow(m) - 1 == 0 zu schreiben, da dann das Ersetzen von 0 durch -1 die Superdiagonale und mit +1 die Subdiagonale verwendet. -2 und 2 verwenden jeweils die zweite Superdiagonale und Subdiagonale und so weiter.

3) oder diese Sequenz von Indizes verwenden:

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

4) oder outer wie folgt verwenden:

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

Dies verallgemeinert gut zu anderen anti-Diagonalen auch als outer(1:n, n:1, "-") ist entlang Anti-Diagonalen konstant. Wir können den Teil innerhalb von [...] schreiben als outer(1:n, n:1) == 0 und wenn wir 0 durch -1 ersetzen erhalten wir die Super-Antidiagonale und mit +1 erhalten wir die Sub-Antidiagonale. -2 und 2 geben die super super und sub sub Antidiagonalen. Zum Beispiel ist die Summe der Antidiagonalen.

+0

Vielen Dank dafür. Ein Teil der Syntax ist über mich hinaus, daher muss ich sehr gründlich und gut durchdachte Beispiele durcharbeiten. – Windstorm1981

4

Sie könnten die Elemente Index aus Sie

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

Danke. Dies ist tatsächlich das, was ich mir vorgestellt habe, aber ich konnte nicht herausfinden, wie ich es schreiben soll. Ich fummelte an einer verschachtelten "for" -Schleife, die mir offensichtlich nicht gab, was ich wollte. – Windstorm1981

2

Hier ist eine einfache Art und Weise summieren wollen, ohne eine Schleife zu verwenden, vorausgesetzt, dass Ihr Matrix ist m:

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

Danke.Dies ist sehr einfach und intuitiv. – Windstorm1981

2

Dies wird manchmal als "sekundäre Diagonale" oder "kleine Diagonale" bezeichnet.

Eine weitere kurze Lösung:

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