2016-07-22 8 views
1

私は、既知の配列番号と配列次元を持たない配列を乗算する必要がある状況にあります。例:ダイナミック次元配列の乗算

demo1 = c(0.45, 0.55) 
demo2 = c(0.1, 0.1, 0.15, 0.15, 0.2, 0.05, 0.15, 0.1) 

myarr <- array(1:n, dim = c(length(demo1), length(demo2))) 

for (p in 1:length(demo1)){ 
    for (q in 1:length(demo2)){ 
     myarr[p,q] <- demo1[p]*demo2[q] 
    } 
} 

デモの数がわかっても問題ありません。しかし、私がデモの数を知らず、長さの乗算の次元の配列を作る必要があるときは、私は知らない。だから、私はデモ= 3または4または5などの数を持つことがあります。上記のforループ内の文を一般化する方法。私がRにとって非常に新しいので、これについてのあなたの迅速な助けに感謝します。事前

+0

あなたが '' demo1''または '' demo2'を知っているとき感謝ダビデはタイプミス... – skj

+0

を整流するために、私は本当に理解していません'。しかし、 '' demo1''と '' demo2''が本当に大きくならない限り、現在の '' demo1''と '' demo2''の計算を繰り返すことができます。 '' demo1%o%demo2''を見てみましょう。これはRのベクトル化を利用し、 '' for''ループよりはるかに高速です(そして短くなります)。 – Phann

+0

返信いただきありがとうございます。デモの数は2を超えることはできません。デモ3、デモ4などがあります。 – skj

答えて

0

の多くのおかげで、あなたのベクトルを乗算する?outerを見たりショートフォーム%o%を持っている:もちろん

myarr <- demo1 %o% demo2 %o% demo3 # %o%... 

、新しいベクトルが追加されるべきであるとする場合には繰り返しそれを行うことができます:

myarr <- demo1 %o% demo2 
myarr <- myarr %o% demo3 
#... 

追加情報:ForループはRが非常に遅く、ベクトル化を使用できる場合は使用しないでください。代わりに、ループのベクトル化を使用して

は、約1000の時間という利点があります:

demo1 <- runif(1000) 
demo2 <- runif(1000) 
system.time({ 
    myarr <- array(1:n, dim = c(length(demo1), length(demo2))) 

    for (p in 1:length(demo1)){ 
    for (q in 1:length(demo2)){ 
     myarr[p,q] <- demo1[p]*demo2[q] 
    } 
    } 
}) 
#round about 6.8s on my system 
system.time(demo1 %o% demo2) 
#round about 0.01s on my system 
+0

*ベクトル化*に関する追加情報として:これは、その中の他の多くの参考文献を含む有益な記事です:http://www.noamross.net/blog/2014/4/16/vectorization-in-r-- why.html – Phann