Извлечение -диагонального среза большой матрицы

У меня есть большая матрица nxn, и я хотел бы снять -диагональных срезов разного размера. Например:

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6

Мне нужна функция R, которая при задании матрицы и «ширины диагонального среза» возвращала бы матрицу nxn только этих значений. Итак, для приведенной выше матрицы и, скажем, 3 я бы получил:

1 x x x x x
1 2 x x x x
1 2 3 x x x
x 2 3 4 x x
x x 3 4 5 x
x x x 4 5 6

На данный момент я использую (простите меня )цикл for, который невероятно медленный:

getDiags<-function(ndiags, cormat){
  resmat=matrix(ncol=ncol(cormat),nrow=nrow(cormat))
  dimnames(resmat)<-dimnames(cormat)
  for(j in 1:ndiags){
    resmat[row(resmat) == col(resmat) + j] <- 
      cormat[row(cormat) == col(cormat) + j]
  }
  return(resmat)
}

Я понимаю, что это очень "не -R" способ решить эту проблему. Есть ли лучший способ сделать это, возможно, с помощью diag или lower.tri?

13
задан blmoore 1 August 2012 в 12:42
поделиться