2016-09-05 23 views
2

3つの行列からなる配列があるとします。私が持っている必要がありますどのようなrの複数の行列の累積和

set.seed(1) 
array1<-array(sample(1:50,18), dim=c(2,3,3)) 
, , 1 
    [,1] [,2] [,3] 
[1,] 14 28 10 
[2,] 19 43 41 
, , 2 
    [,1] [,2] [,3] 
[1,] 42 27 9 
[2,] 29 3 7 
, , 3 
    [,1] [,2] [,3] 
[1,] 44 48 25 
[2,] 15 18 33 

は1は、最初の2つの行列の和であり、他方は3つの行列の和である、2マトリックス状に累積行列です。明らかに、私は以下のように2つの行列の和を計算することによってそれらを得ることができます。

array1[,,1]+array1[,,2] 
    [,1] [,2] [,3] 
[1,] 56 55 19 
[2,] 48 46 48 

array1[,,1]+array1[,,2]+array1[,,3] 
    [,1] [,2] [,3] 
[1,] 100 103 44 
[2,] 63 64 81 

しかし、私は多くの行列がある場合には、単純な機能を備えた累積行列を生成する方法を知りたいのです。

ありがとうございました。

+0

私は 'apply(apply1、c(1,2)、sum) 'を使うことができます。 – akrun

+0

@akrunありがとうございます。 –

答えて

2

我々はMARGINapplyを使用してsum

apply(array1[,,1:2], c(1,2), sum) 
#  [,1] [,2] [,3] 
#[1,] 56 55 19 
#[2,] 48 46 48 

apply(array1, c(1,2), sum) 
#  [,1] [,2] [,3] 
#[1,] 100 103 44 
#[2,] 63 64 81 

それとも我々はMARGIN=1を指定して取得し、初期化した後rowSums

t(apply(array1[,, 1:2], 1, rowSums)) 
t(apply(array1, 1, rowSums)) 

それとも別のオプションがforループで取得することができます出力行列( 'r2')

r2 <- matrix(0, nrow = nrow(array1[,,1]), ncol = ncol(array1[,,1])) 
for(j in seq(dim(array1)[3])){ 
    r2 <- r2 + array1[,,j] 
} 
r2 
# [,1] [,2] [,3] 
#[1,] 100 103 44 
#[2,] 63 64 81 

seq(dim(array1)[3])の代わりに、forループにhead(seq(dim(array1)[3]),2)を使用してください。

2

ちょうどあなたの具体的な例のためにakrunのアプローチに追加する、作成、アレイ内加算する関数形は次のようになります。ユーザーが行列を設定することができますので、もちろん

set.seed(1) 
SumMatrices<-function(beginSum,endSum,n){ 
matrixArray<-array(sample(1:50,6*n), dim=c(2,3,n)) 
#where 6 is the product of the first two dimensions - 2*3, 
#and 1:50 are the limits of the random number generation 
apply(matrixArray[,,beginSum:endSum], c(1,2), sum) 
#beginSum and endSum are the matrices within the array you would 
#like to sum 
} 
SumMatrices(1,2,3) 

、これも一般化することができます。配列内で希望の次元にする:

set.seed(1) 
SumMatrices<-function(beginSum,endSum,x,y,n){ 
matrixArray<-array(sample(1:50,x*y*n), dim=c(x,y,n)) 
apply(matrixArray[,,beginSum:endSum], c(1,2), sum) 
} 
SumMatrices(1,2,2,3,3) 

これはあなたの質問にお答えします。