2013-05-21 3 views
5

Есть ли простой способ извлечь вектор «смещения» и «наоборот» «диагональ» (x) матрицы в R?Как найти смещенную диагональ матрицы?

 [,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 

Я попытался diag() но does'nt, кажется, принимать какие-либо варианты ..

ответ

7

1) i -го смещения обратной диагональной квадратной матрицы m:

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

Например:

> 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) Мы также можем написать функцию замены:

"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) 
} 

Например,

> 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! Это меня полностью смутило, пока я не понял, что приоритет оператора означает, что это 'm [((stuff) %% ncol (m)) == 1]'. –

5

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

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

Вы можете позвонить по диагонали на матрице с колонны перевернутые, например:

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 

Для смещения вам нужно только удалить количество строк и столбцов, соответствующих смещению.

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

Для смещения побочной диагонали объединить оба

diag(m[-1, -1][3:1,]) 
#> diag(m[-1, -1][3:1,]) 
#[1] 8 11 14 
Смежные вопросы