2013-06-26 13 views
6

Iは、配列減算行列、Nの行列のアレイからk次元、k次元

A <- array(0, c(4, 3, 5)) 
for(i in 1:5) { 
    set.seed(i) 
    A[, , i] <- matrix(rnorm(12), 4, 3) 
} 

及びIは、行列B

set.seed(6) 
B <- matrix(rnorm(12), 4, 3) 

にBを減算するためのコードがある場合がある場合

d<-array(0, c(4,3,5)) 
for(i in 1:5){ 
    d[,,i]<-A[,,i]-B 
} 

ただし、「a」の関数を使用して同じ計算を実行するコードはどのようになりますかpply "ファミリー?

答えて

8

これはsweepが何のためにあるのかです。

sweep(A, 1:2, B) 
+0

多くの感謝:)多くのおかげで、さらに別の強力なコマンド...私はRが大好き!名前は「適用」とは異なります。 –

+0

ため – smci

6

たぶん、非常に直感的ではない:

A[] <- apply(A, 3, `-`, B) 
+0

貴重な回答のためのTnx。 A []を保持している間にRに実際に何を言うのか教えてください。 –

+2

これは、角括弧内の 'A 'の要素に代入することを意味します。索引作成時に、欠落しているディメンションは「そのディメンション内のすべての要素を選択する」ことを意味します。例えば、 'mat [1、]'は「行列 'mat'の第1行とすべての列を選択します。この慣習は、1次元の索引付けを行う場合にも当てはまります。したがって、 '[]'は「すべての要素を選択」を意味します。ここでは、寸法を損なわずに「A」に割り当てます。これはここで必要です。なぜなら、 'apply'自体が2次元構造を返し、3次元結果が欲しいからです。 (非統計に)全く非直感的な名前で –

+0

グレートの説明、この情報 –

4

あなたが最後の配列の次元にループしているので、あなたは、単に行うことができます。

d <- A - as.vector(B) 

、それははるかに高速になります。行列からベクトルを減算するときと同じ考えです。ベクトルはリサイクルされ、各列に減算されます。

+0

+1これは良い事実です –

+0

配列の全体の大きさをループする必要がありました。たぶん私はいくつかの誤解を導入しました。なぜなら、最初の投稿では、配列の最後の次元についてのみ数値の差分を与えるset.seed(5)を書きました。しかし、私は投稿(例えばset.seed(i))を編集して、おそらくもっとわかりやすくわかりやすくしようとしています。 しかし、多くの返信に感謝! –

+0

@Newbie_R:私の答えがあなたと同じ結果をもたらしているとは思わないと思います。 – flodel