大きな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
行列と「対角スライスの幅」が与えられると、それらの値だけのnxn行列を返すR関数が欲しいです。したがって、上記のマトリックスと、たとえば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を使用して、それを行うためのより良い方法はありますか?