如何简洁地计算Julia数组中行项目的百分比差异

如何简洁地计算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

鉴于:

这为我提供了以下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  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]
  • 如何使第一行零匹配(从而使数组的类型正确地为Float64)
  • ……甚至更好

  • 有没有一种不那么笨重的方法,从数组中抽出N-1行,然后加上一行零(有没有一种更规范的方法

  • 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
    vs
    37.214 ns
    。确实有额外的分配。另一方面,理解与循环之间存在开销,这让我完全感到惊讶。