2013-05-21 18 views
5

Czy istnieje prosty sposób na wyodrębnienie wektora "przesunięcia" i "odwrócenia" "przekątnej" (x's) macierzy w R?Jak znaleźć przesunięcie przekątnej matrycy?

 [,1] [,2] [,3] [,4] [,5] 
[1,] x 0 0 0 0 
[2,] 0 0 0 0 x 
[3,] 0 0 0 x 0 
[4,] 0 0 x 0 0 
[5,] 0 x 0 0 0 

Próbowałem diag() ale does'nt wydają się przyjmować żadnych opcji ..

Odpowiedz

7

1) i -ty przesunięcie do tyłu przekątnej kwadratowych macierzy m:

off.rev.diag <- function(m, i = 0) m[ (row(m) + col(m) - 1) %% ncol(m) == i ] 

Na przykład:

> m <- matrix(1:25, 5); m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 6 11 16 21 
[2,] 2 7 12 17 22 
[3,] 3 8 13 18 23 
[4,] 4 9 14 19 24 
[5,] 5 10 15 20 25 
> off.rev.diag(m, 1) 
[1] 1 10 14 18 22 
> off.rev.diag(m, 2) 
[1] 2 6 15 19 23 

2) Możemy również napisać funkcję zastępczą:

"off.rev.diag<-" <- function(m, i = 0, value) { 
    m.ix <- matrix(seq_along(m), nrow(m)) 
    replace(m, off.rev.diag(m.ix, i), value) 
} 

na przykład

> off.rev.diag(m, 1) <- -(1:5) 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] -1 6 11 16 21 
[2,] 2 7 12 17 -5 
[3,] 3 8 13 -4 23 
[4,] 4 9 -3 19 24 
[5,] 5 -2 15 20 25 
+1

Dang! To mnie całkowicie zdezorientowało, dopóki nie uświadomiłem sobie, że pierwszeństwo operatora oznacza, że ​​jest to 'm [((stuff) %% ncol (m)) == 1]'. –

5

Można to zrobić ręcznie, z pewnymi indeksowanie-by-a-wektorze sztuczek:

offset.rev.diag <- function(x, nrow, ncol, offset=1) { 
    diag(x, nrow, ncol)[rev(1:nrow), c((offset+1):ncol, 1:offset)] 
} 

> offset.rev.diag(1, 5, 5) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 0 0 0 1 0 
[2,] 0 0 1 0 0 
[3,] 0 1 0 0 0 
[4,] 1 0 0 0 0 
[5,] 0 0 0 0 1 

> offset.rev.diag(1, 5, 5, 3) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 0 1 0 0 0 
[2,] 1 0 0 0 0 
[3,] 0 0 0 0 1 
[4,] 0 0 0 1 0 
[5,] 0 0 1 0 0 
2

Można zadzwonić po przekątnej na matrycy z odwrócone kolumny, takie jak:

m = matrix(1:16, ncol = 4L, nrow = 4L) 
m 
diag(m[,ncol(m):1]) 
#> m 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 5 9 13 
#[2,] 2 6 10 14 
#[3,] 3 7 11 15 
#[4,] 4 8 12 16 
#> diag(m[,ncol(m):1]) 
#[1] 13 10 7 4 

W przypadku przesunięcia wystarczy usunąć liczbę wierszy i kolumn odpowiadającą przesunięciu.

diag(m[-nrow(m),-1]) 
#> diag(m[-nrow(m),-1]) 
#[1] 5 10 15 

Dla offset wtórne przekątnej połączyć zarówno

diag(m[-1, -1][3:1,]) 
#> diag(m[-1, -1][3:1,]) 
#[1] 8 11 14 
Powiązane problemy