Vas*_*tch 3 multidimensional-array julia
我有一个带有两个向量字段的xy网格u
和v
。余代表矢量场作为Array{Float64, 3}
与尺寸nx
× ny
× 2
。我想将点积u.v
作为标量字段(Array{Float64,2}
尺寸为nx
× ny
)。做到这一点的最佳方法是什么?
像这样的东西将是完美的dot(u,v,3)
,其中3是点积的尺寸。
nx, ny = 3, 4
u = Array{Float64,3}(rand(0:1, nx, ny, 2))
#[0.0 1.0 0.0 1.0; 1.0 0.0 1.0 0.0; 1.0 0.0 1.0 0.0]
#[1.0 0.0 1.0 0.0; 1.0 0.0 0.0 1.0; 1.0 0.0 1.0 1.0]
v = Array{Float64,3}(rand(0:1, nx, ny, 2))
#[1.0 1.0 1.0 1.0; 0.0 1.0 0.0 0.0; 0.0 1.0 1.0 0.0]
#[1.0 0.0 0.0 0.0; 0.0 1.0 0.0 0.0; 1.0 1.0 1.0 0.0]
[dot(u[i,j,:], v[i,j,:]) for i in 1:nx, j in 1:ny]
3×4 Array{Float64,2}:
1.0 1.0 0.0 1.0
0.0 0.0 0.0 0.0
1.0 0.0 2.0 0.0
Run Code Online (Sandbox Code Playgroud)
sum(u.*v,3)
(合理地)既快又短。
要明确获得矩阵,您可以像这样挤压第三维 squeeze(sum(u.*v,3), 3)
更新:当然,这是分配的,如果速度决定一切,那不是最佳答案。在这种情况下,请参见@DNF的直接循环实现,该实现基本上是您所能达到的。