[R] apply on a 4D array

Benjamin.STABLER@odot.state.or.us Benjamin.STABLER at odot.state.or.us
Thu Sep 25 20:19:07 CEST 2003


I am trying to multiply a 3D array of 4x4x4 by the 4 3D arrays of a 4D array
with dimensions 4x4x4x4 (the last dimension being the one that I want to
split by).  

(4x4x4 array)
> hiaAry
, , a1

          i1       i2      i3        i4
h1 9.5936098 6.001040 0.08772 0.3138600
h2 1.2003500 1.454570 2.79248 0.0000000
h3 0.1346500 0.201220 0.39256 0.5464000
h4 0.0109000 0.012270 0.16417 0.2766900

, , a2

          i1          i2       i3       i4
h1 195.08275 74.23508453 39.23165 14.89689
h2   1.80127  7.41649055  6.97972  2.77784
h3   0.00000  0.27444002  0.77353  6.10322
h4   0.01554  0.01232000  0.40669  3.69832

, , a3

         i1          i2      i3      i4
h1 25.81161 13.57603931 6.40551 1.38103
h2  2.61562  2.26407003 2.13906 1.41652
h3  0.05780  0.30406001 1.15228 0.00000
h4  0.00000  0.04258000 0.22346 0.43209

, , a4

         i1       i2         i3      i4
h1 59.47618 16.54495 0.00000000 0.00000
h2  1.50265  2.76623 0.00000000 0.08917
h3  0.00000  0.42722 0.00000000 1.29230
h4  0.00000  0.00000 0.07564002 0.34235


(4x4x4x4 array)
dim "wX" is the dimension that I want to split the array by.
> probAry
, , a1, w1

          i1         i2         i3          i4
h1 0.3784811 0.17321659 0.11236581 0.157227931
h2 0.2569944 0.08635110 0.03812272 0.036192191
h3 0.1659365 0.04928920 0.01856106 0.015686506
h4 0.0939886 0.02551057 0.00846568 0.006614069

, , a2, w1

          i1         i2          i3          i4
h1 0.3227855 0.14088002 0.090150394 0.127416178
h2 0.2181195 0.07210281 0.032273293 0.031203848
h3 0.1409469 0.04170138 0.015971840 0.013690984
h4 0.0804619 0.02189455 0.007375192 0.005817293

, , a3, w1

          i1        i2         i3        i4
h1 0.7558389 0.5157448 0.39155036 0.4867531
h2 0.6611814 0.3640772 0.20821663 0.2126003
h3 0.5494104 0.2540337 0.11997469 0.1092745
h4 0.4100844 0.1566448 0.06143343 0.0507088

, , a4, w1

          i1        i2        i3        i4
h1 0.9445381 0.8542088 0.7797483 0.8391612
h2 0.9234338 0.7957714 0.6755850 0.7172834
h3 0.8941212 0.7257939 0.5631331 0.5815922
h4 0.8487089 0.6284291 0.4226977 0.4107244

, , a1, w2................................

I thought it would be something along the lines of apply(4Darray, c(1,2,3),
function(x) x*3Darray).  But this returns the results in the form of 64rows
by dim1 by dim2 by dim3.

, , i4, a4
                h1           h2           h3           h4
 [1,]   8.05058486 6.881337e+00 5.579569e+00  3.940329195
 [2,]   0.19306289 2.185652e-01 2.347175e-01  0.219540239
 .
 .
 .
[63,]   0.00000000 1.300468e-01 2.430320e-01  0.395577205
[64,]   0.00000000 0.000000e+00 1.191559e-02  0.034329350

It looks like the rows are all the combinations of the 4th dimension with
the other dimensions.  So then I thought I could array it back to the
dimensions I want and maybe use aperm if I needed to.  But there must be a
better way to do this.  I can of course just multiple the 3D array by each
3D cube of the 4D array with a loop...but that would be inefficient.  

I thought maybe sweep(4Darray, 4, 3Darray, "*"), but that returns different
results than multiplying each 3D array by each 3D cube of the 4D array.  I
guess what I am asking is for some clarification on apply and sweep.  I have
read the manuals and searched the list, but I can't seem to find much about
operations with 3 or more dimensions.  Thanks.

Ben Stabler




More information about the R-help mailing list