我将粒子的速度存储为向量向量。每行都是一个 SVector,其索引为 x、y、z 速度。
SVector 的算术速度非常好,但它们有点……难以操作。我将如何以比以下更优雅的方式将矢量中的所有 x、y、z 平方速度相加
using StaticArrays
n = 5
v = [SVector{3}(rand(), rand(), rand()) for i = 1:n]
x, y, z = 0.0, 0.0, 0.0
for i=1:n
x += v[i][1]^2
y += v[i][2]^2
z += v[i][3]^2
end
sumv = SVector{3}(x, y, z)
Run Code Online (Sandbox Code Playgroud)
如果我只想在我的速度中对 x、y、z 求和,而不需要平方,那么 Julia 很简单,只会sum(v)给我一个求和列的向量。
我的一种解决方案是
sum([v[i].^2 for i=1:n])
Run Code Online (Sandbox Code Playgroud)
但必须有一个更简单的解决方案,不需要理解?
该sum函数可以采用高阶函数,在添加元素之前转换每个元素。
julia> sum(x->x.^2, v)
3-element SArray{Tuple{3},Float64,1,3} with indices SOneTo(3):
2.104874346619557
1.2512923674436118
1.5781536056190726
Run Code Online (Sandbox Code Playgroud)
这给出了与您的理解相同的答案:
julia> sum(x->x.^2, v) == sum([v[i].^2 for i=1:n])
true
Run Code Online (Sandbox Code Playgroud)