Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 给定维上数组的元素和_Julia - Fatal编程技术网

Julia 给定维上数组的元素和

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)在任何维

我对朱莉娅很陌生,通过做一些项目来学习这些东西

我被困在按元素对所有矩阵数组求和的部分

中堂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
)在任何维度上求和

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(分配与度量中的分配相同,但始终不变)。