Julia 给定维上数组的元素和
我对朱莉娅很陌生,通过做一些项目来学习这些东西 我被困在按元素对所有矩阵数组求和的部分 中堂2*2*1000三维阵列。基本上,它是关于找到1000个样本的平均方差协方差矩阵。它在1到1000之间迭代 我试图使用Sum命令,但它给了我标量。 我需要[2,2,1]+[2,2,2]+[2,2,3]+。。。[2,2100]=(2乘2矩阵)Julia 给定维上数组的元素和,julia,Julia,我对朱莉娅很陌生,通过做一些项目来学习这些东西 我被困在按元素对所有矩阵数组求和的部分 中堂2*2*1000三维阵列。基本上,它是关于找到1000个样本的平均方差协方差矩阵。它在1到1000之间迭代 我试图使用Sum命令,但它给了我标量。 我需要[2,2,1]+[2,2,2]+[2,2,3]+。。。[2,2100]=(2乘2矩阵) 有没有不使用循环的简单方法?正如评论中所指出的,如果你有一个三维数组 julia> x = rand(2,2,1000); 您可以使用(取自?sum)在任何维
有没有不使用循环的简单方法?正如评论中所指出的,如果你有一个三维数组
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(和(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)
julia>函数f(x::AbstractArray{@btime-dropdims(sum($x,dims=3),dims=3);
7.034μs(19次分配:592字节)
朱莉娅>@b时间f($x);
5.205μs(1个分配:112字节)
正如评论中已经指出的,如果您有一个三维数组
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(和(x,dims=3),dims=3)
备注(更新)
Julia中的循环速度很快。因此,如果不是为了方便,您可以通过使用循环实现更快地获得结果,例如
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)
julia>函数f(x::AbstractArray{@btime-dropdims(sum($x,dims=3),dims=3);
7.034μs(19次分配:592字节)
朱莉娅>@b时间f($x);
5.205μs(1个分配:112字节)
总和(x,dims=3)
。如果任何函数f
的行为与预期不符,请尝试在REPL处键入?f
以寻求帮助。基本语言中的所有函数都有很好的文档记录。此外,对于将来的问题,最好包含代码片段。我假定您是MATLAB用户。sum
,mean
,std
,在julia中带有sin与MATLAB不同,gle参数不适用于默认维度。如果不指定维度,则它们的工作方式与数组为一维一样。如果sum
,则它汇总数组中的所有元素。您需要在案例中指定维度。sum(x,dims=3)
。如果任何函数f
的行为与预期不符,请尝试在REPL处键入?f
以寻求帮助。基本语言中的所有函数都有很好的文档记录。此外,对于将来的问题,最好包含代码片段。我假定您是MATLAB用户。sum
,mean
,std
,在julia中带有sin与MATLAB不同,gle参数不在默认维度上工作。如果不指定维度,它们的工作方式就像数组是一维的。如果求和
,它将对数组中的所有元素求和。您需要在本例中指定维度。我想在f
中,您应该使用somet初始化结果
类似于零(eltype(x),nrows,ncol)
相反(未初始化的相似的生成的值通常类似于6.94486e-310
,这使得人们没有注意到差异…)因为您是为抽象数组定义的,所以应该在轴(x,3)中为k使用
等。例如,你可以有一个具有零基索引的数组。事实上,我认为应该始终使用轴
,每个hindex
,等等。循环的改善可能并不显著;使用n==100000
进行测试,我测量的循环为1.506ms,一个线性为953.397μs(分配与度量中的分配相同,但无论如何都是常量)。我想在f
中,应该使用0(eltype(x)、nrow、ncol)之类的值来初始化result
(未初始化的值相似的
产生的结果通常类似于6.94486e-310
,这使得人们没有注意到差异…)因为您是为AbstractArray
s定义的,所以应该在轴(x,3)中为k使用
等。例如,你可以有一个具有零基索引的数组。事实上,我认为应该始终使用轴
,每个hindex
,等等。循环的改善可能并不显著;使用n==100000
进行测试,我测量的循环为1.506ms,一个线性为953.397μs(分配与度量中的分配相同,但始终不变)。