【问题标题】:Multiply each dimension of an array by a different value将数组的每个维度乘以不同的值
【发布时间】:2018-02-15 12:08:39
【问题描述】:

我有一个 3 维数组 (a),第 3 维的长度等于 2。 我还有一个长度为 2 的向量 (MU.A)。

> dx <- dy <- 0.25
> nx=ny=1/dx
> nz=2

> a <- array(rep(c(3,4,0,1),each=nx*ny/2), dim=c(nx,ny,nz))
> a
, , 1
     [,1] [,2] [,3] [,4]
[1,]    3    3    4    4
[2,]    3    3    4    4
[3,]    3    3    4    4
[4,]    3    3    4    4

, , 2
     [,1] [,2] [,3] [,4]
[1,]    0    0    1    1
[2,]    0    0    1    1
[3,]    0    0    1    1
[4,]    0    0    1    1

> MU.A=seq(from=0.2,to=0.8,by=0.6/(nz-1))
> MU.A
[1] 0.2 0.8

我想将 a[ , ,1] 乘以 MU.A[1] ; a[ , ,2] 由 MU.A[2] ;如果我的对象更大,依此类推。 我找到了一种方法,但我不确定这是最好/最快的方法:

> array(mapply('*',a,rep(MU.A,each=nx*ny)),dim=c(nx,ny,nz))
, , 1

     [,1] [,2] [,3] [,4]
[1,]  0.6  0.6  0.8  0.8
[2,]  0.6  0.6  0.8  0.8
[3,]  0.6  0.6  0.8  0.8
[4,]  0.6  0.6  0.8  0.8

, , 2

     [,1] [,2] [,3] [,4]
[1,]    0    0  0.8  0.8
[2,]    0    0  0.8  0.8
[3,]    0    0  0.8  0.8
[4,]    0    0  0.8  0.8

有没有最简单的方法?

【问题讨论】:

    标签: r apply dimensions scanning


    【解决方案1】:

    可能最有效(这取决于问题的大小)的方式是使用矢量回收。为此,您只需要置换数组维度,使第三个维度成为第一个维度,相乘,然后将维度置换回来:

    aperm(aperm(a, c(3, 1, 2)) * MU.A, c(2, 3, 1))
    

    【讨论】:

    • 能不能扩展一下aperm是什么,c(3,1,2)c(2,3,1)的作用是什么
    • @Seymour 我已经做到了。语法在help("aperm")中解释。
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2012-04-27
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多