有没有一种优雅的方法可以对Julia中静态数组向量中的列求和



我将粒子的速度存储为向量向量。每一行都是一个向量,其索引为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)

如果我只想求速度中的x,y,z的和,而不求平方,Julia很简单,只要sum(v)就会给我一个求和列的向量。

我有一个解决方案是

sum([v[i].^2 for i=1:n])

但一定有一个更简单的解决方案,不需要理解吗?

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

这给出了与你的理解相同的答案:

julia> sum(x->x.^2, v) == sum([v[i].^2 for i=1:n])
true

矩阵是什么?

n=5
mat = SMatrix{3, n}([rand() for i = 1:n*3])
sum(mat .^ 2, dims=2)

最新更新