我对朱莉娅(Julia)很陌生,他通过做一些项目来学习这些东西。
我被困在按元素求和所有矩阵数组的部分。
我天真2 * 2 * 1000 3维数组。基本上,它可以找到1000个样本的平均方差-协方差矩阵。迭代1到1000。
我尝试使用Sum命令,但它给了我标量。 我需要[2,2,1] + [2,2,2] + [2,2,3] + ... [2,2,100] =(2 x 2矩阵)
有没有不用循环的简单方法吗?
答案 0 :(得分:2)
正如注释中已经指出的那样,如果您有3维数组,
julia> x = rand(2,2,1000);
您可以使用(取自?sum
)来对任意维度求和
sum(A::AbstractArray; dims)
数组在给定维度上的总和。
就您而言,
julia> result = sum(x, dims=3);
但是请注意,结果仍将具有3维,可以通过ndims
或通过使用typeof
检查类型来检查:
julia> ndims(result)
3
julia> typeof(result)
Array{Float64,3}
此行为的原因是类型稳定性。我们总结的第三个维度将是单例维度,
julia> size(result)
(2, 2, 1)
可以拖放以得到所需的2x2矩阵结果
julia> dropdims(result, dims=3)
2×2 Array{Float64,2}:
510.444 503.893
489.592 480.065
总共dropdims(sum(x, dims=3), dims=3)
。
备注(更新)
在朱莉娅,循环很快。因此,如果不只是为了方便起见,您可以使用循环实现来更快地获得结果,例如
julia> function f(x::AbstractArray{<:Number, 3})
nrows, ncols, n = size(x)
result = zeros(eltype(x), nrows, ncols)
for k in 1:n
for j in 1:ncols
for i in 1:nrows
result[i,j] += x[i,j,k]
end
end
end
result
end
f (generic function with 1 method)
julia> @btime dropdims(sum($x, dims=3), dims=3);
7.034 μs (19 allocations: 592 bytes)
julia> @btime f($x);
5.205 μs (1 allocation: 112 bytes)