如何简洁地计算Julia数组中行项目的百分比差异
鉴于: 这为我提供了以下3 x 2阵列:如何简洁地计算Julia数组中行项目的百分比差异,julia,Julia,鉴于: 这为我提供了以下3 x 2阵列: C = reshape([1.0, 2.0,1.1, 2.2, 1.2, 2.3],2,3)' 我要做的是遍历这些行,并获得项目之间的%差异。因此,对于每一行r计算(r-th+1/r-th)-1,然后返回结果,新的第一行全部为零。(例如,Col1将是(1.1/1.0)-1,然后是(1.2/1.1)-1,然后是Col2中的相同模式) 为了理解,我试着用以下方法来做: 3×2 Array{Float64,2}: 1.0 2.0 1.1 2.2 1.2
C = reshape([1.0, 2.0,1.1, 2.2, 1.2, 2.3],2,3)'
我要做的是遍历这些行,并获得项目之间的%差异。因此,对于每一行r
计算(r-th+1/r-th)-1,然后返回结果,新的第一行全部为零。(例如,Col1将是(1.1/1.0)-1,然后是(1.2/1.1)-1,然后是Col2中的相同模式)
为了理解,我试着用以下方法来做:
3×2 Array{Float64,2}:
1.0 2.0
1.1 2.2
1.2 2.3
4×1 Array{Any,2}:
0.0
0.0
[0.1,0.1]
[0.0909091,0.0454545]
我希望得到的是:
[zeros(length(C[1,:]),1);[(C[i+1,:] ./ C[i,:]) - 1 for i=1:length(C[:,1])-1]]
但我得到的是:
3×1 Array{Float64,2}:
[0.0,0.0]
[0.1,0.1]
[0.0909091,0.0454545]
Julia的一个主要优点是,当循环清晰简单时,不需要编写矢量化代码:
C=[1.02.0;
1.1 2.2;
1.2 2.3;]
功能行_差异(a)
b=类似(a)
b[1,:]=0
对于i,在2:尺寸(a,1)
b[i,:]=a[i,:]./a[i-1,:]-1
结束
返回b
结束
输出:
julia>row_diff(C)
3×2数组{Float64,2}:
0.0 0.0
0.1 0.1
0.0909091 0.0454545
事实上,Julia中的纯循环通常更快,因为可以避免中间副本并保持缓存位置(Julia数组具有列主顺序):
功能行差异快速(a)
b=类似(a)
对于j英寸1:尺寸(a,2)
b[1,j]=0
对于i,在2:尺寸(a,1)
b[i,j]=a[i,j]/a[i-1,j]-1
结束
结束
返回b
结束
编辑:
如果您真的想要一条直线(与上面的直接循环相比速度较慢):
[zero(1,size(C,2));diff(C,1)。/C[1:end-1,:]
如果要使用一行理解:
3×2 Array{Float64,2}:
1.0 2.0
1.1 2.2
1.2 2.3
4×1 Array{Any,2}:
0.0
0.0
[0.1,0.1]
[0.0909091,0.0454545]
性能应该类似于循环。如何
[C[j,:]./C[i,:]-1 for(i,j)in-zip([1,1:size(C,1)-1…],1:size(C,1))]
?如果计算到位,覆盖原始值,速度会更快。这完全可以在没有分配的情况下工作,而分配占用了大部分时间(实际上已对其进行了基准测试)。性能仅与我的第一个循环相似,主要是因为vcat
制作了一个副本,但也因为理解的开销。对于小矩阵,开销似乎特别大。对于上面的C
,与Julia 0.5的我的电脑上的412.654 ns
vs37.214 ns
。确实有额外的分配。另一方面,理解与循环之间存在开销,这让我完全感到惊讶。