1

配列の反対角を抽出したい

m=array(1:18,c(3,3,2))

私のベストショット

k=dim(m)[3]

mn=matrix(nrow = k, ncol = 3)

for (i in 1:k){
  mn=diag(m[,,i][3:1,1:3])
  }

12 14 16これは、配列の 2 番目の行列の逆対角である を返します。これを達成したい

[1] 3  5  7
[2] 12 14 16

「アンチ診断」を配列として欲しい

手動diag(m[,,1][3:1,1:3])diag(m[,,2][3:1,1:3])正常に動作しますが、使用している配列はdim(c(3,3,22))であるため、「ループ!」と思いました。

MQ: ループを使用して配列から逆対角線を抽出する方法は? (より優れたエレガントなソリューションは大歓迎です)

4

2 に答える 2

1

3 番目の次元全体で使用し、列の順序を逆にしてその対角を取ることlapplyにより、最初に行列を回転させることで反対角線を抽出できます (このすばらしい回答を参照してください)。基本的にはこんな...

out <- lapply( 1:dim(m)[3] , function(x) diag( t( apply( m[,,x] , 2 , rev ) ) ) )
[[1]]
[1] 3 5 7

[[2]]
[1] 12 14 16

それらを配列として接着する必要がある場合は、do.call...を使用します

do.call( rbind , out )
     [,1] [,2] [,3]
[1,]    3    5    7
[2,]   12   14   16

この特定のケースでは、forループがはるかに高速になり(ベンチマーク)、@DWinの回答を使用する必要があります。

これを少し単純化して、リストの使用や(の範囲外で利用可能であるとlapply仮定することで) の不適切な使用を避けることができると思います。これは、行列の 3 次元を単純に横断することもできるからです。したがって、一度行列を回転させてから、回転した各行列を次のように取得できます...mlapplyapplyapplydiag

rotM <- apply( m , 2:3 , rev )    
out <- t( apply( rotM , 3 , diag ) )
     [,1] [,2] [,3]
[1,]    3    5    7
[2,]   12   14   16
于 2013-08-21T09:16:48.837 に答える