朱莉娅在所需尺寸上打点产品的方法是什么

Vas*_*tch 3 multidimensional-array julia

我有一个带有两个向量字段的xy网格uv。余代表矢量场作为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)

crs*_*nbr 5

sum(u.*v,3) (合理地)既快又短。

要明确获得矩阵,您可以像这样挤压第三维 squeeze(sum(u.*v,3), 3)

更新:当然,这是分配的,如果速度决定一切,那不是最佳答案。在这种情况下,请参见@DNF的直接循环实现,该实现基本上是您所能达到的。