2016-11-03 3 views

Antwort

2

Sie können aperm verwenden und die Vektorisierung ausnutzen. Sie müssen angeben, welche die "allgemeinen" Dimensionen sind (d. H. Die Abmessungen, die sowohl in X als auch in C enthalten sind), permutieren X und multiplizieren. Etwas wie:

#declare which are the dimensions in X common to C 
commonDims<-c(3,4) 
#the other dimensions are the "uncommon" ones 
uncommonDims<-setdiff(seq_along(dims),commonDims) 
#then you can get the sum 
sum(as.vector(aperm(X,c(commonDims,uncommonDims)))*as.vector(C)) 

Wir testen das Ergebnis oben mit dem mit for Schleifen erhalten:

set.seed(456) 
dims<-c(5,6,2,3,8) 
commonDims<-c(3,4) 
uncommonDims<-setdiff(seq_along(dims),commonDims) 
C<-array(runif(prod(dims[commonDims])),dims[commonDims]) 
X<-array(runif(prod(dims)),dims) 
sum(as.vector(aperm(X,c(commonDims,uncommonDims)))*as.vector(C)) 
#[1] 371.3749 
#Calculation through loops 
rsum<-0 
for (i in 1:dims[1]) 
    for (j in 1:dims[2]) 
    for (k in 1:dims[3]) 
    for (r in 1:dims[4]) 
    for (t in 1:dims[5]) rsum<-rsum + X[i,j,k,r,t]*C[k,r] 
rsum 
#[1] 371.3749 
+0

klare und präzise Antwort! – user1783739