【发布时间】:2020-06-07 13:16:25
【问题描述】:
我必须在 Stokes 求解器中每个时间步执行 3x3x3x3 4D 张量 +100k 次的旋转,其中旋转的 4D 张量是 Crot[i,j,k,l] = Crot[i,j,k, l] + Q[m,i] * Q[n,j] * Q[o,k] * Q[p,l] * C[m,n,o,p],所有索引从 1 到 3。
到目前为止,我已经在 Julia 中天真地编写了以下代码:
Q = rand(3,3)
C = rand(3,3,3,3)
Crot = Array{Float64}(undef,3,3,3,3)
function rotation_4d!(Crot::Array{Float64,4},Q::Array{Float64,2},C::Array{Float64,4})
aux = 0.0
for i = 1:3
for j = 1:3
for k = 1:3
for l = 1:3
for m = 1:3
for n = 1:3
for o = 1:3
for p = 1:3
aux += Q[m,i] * Q[n,j] * Q[o,k] * Q[p,l] * C[m,n,o,p];
end
end
end
end
Crot[i,j,k,l] += aux
end
end
end
end
end
与:
@btime rotation_4d(Crot,Q,C)
14.255 μs (0 allocations: 0 bytes)
有没有办法优化代码?
【问题讨论】:
-
搜索爱因斯坦求和;似乎有
Einsum以及更有效的在线实现。