У меня есть большая матрица 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?