【问题标题】:Optimizing custom fill of a 2d array in Julia在 Julia 中优化二维数组的自定义填充
【发布时间】:2021-04-12 23:29:37
【问题描述】:

我对 Julia 有点陌生,我正在尝试使用 fill! method 来提高 Julia 的代码性能。目前,我从read_array 文件中读取了一个二维数组,并对其执行行操作以获得processed_array,如下所示:

function preprocess(matrix)
# Initialise
    processed_array= Array{Float64,2}(undef, size(matrix)); 
#first row of processed_array is the difference of first two row of matrix
    processed_array[1,:] = (matrix[2,:] .- matrix[1,:]) ; 
#last row of processed_array  is difference of last two rows of matrix
    processed_array[end,:] = (matrix[end,:] .- matrix[end-1,:]); 
#all other rows of processed_array  is the mean-difference of other two rows
    processed_array[2:end-1,:] = (matrix[3:end,:] .- matrix[1:end-2,:]) .*0.5 ; 
    return processed_array
end

但是,当我尝试使用 fill! 方法时,我得到了 MethodError

processed_array = copy(matrix)
fill!(processed_array [1,:],d[2,:]-d[1,:])

MethodError: Cannot convert an object of type Matrix{Float64} to an object of type Float64

如果有人能告诉我我缺少什么并建议一种优化代码的方法,我会很高兴。提前致谢!

【问题讨论】:

    标签: arrays optimization multidimensional-array julia


    【解决方案1】:

    fill!(A, x) 用于用唯一值x 填充数组A,所以无论如何这不是你想要的。

    为了提高性能,您可以做的是广播作业。也就是说,使用.= 而不是=。如果您愿意,您还可以使用@. 宏自动为您添加点(可能更简洁/更易于阅读的代码):

    function preprocess(matrix)
        out = Array{Float64,2}(undef, size(matrix))
        @views @. out[1,:] = matrix[2,:] - matrix[1,:]
        @views @. out[end,:] = matrix[end,:] - matrix[end-1,:]
        @views @. out[2:end-1,:] = 0.5 * (matrix[3:end,:] - matrix[1:end-2,:]) 
        return out
    end
    

    为了获得最佳性能,我认为您可能希望显式编写循环并使用多线程和像 LoopVectorization.jl 这样的包。

    PS:请注意,在您的代码 cmets 中,您写的是“cols”而不是“rows”,并且您写了“mean”,但有所不同。 (不确定是故意的。)

    【讨论】:

    • 在前面添加@views 会有所帮助——否则这里的每个切片都会生成一个新的Array
    • 谢谢!将其添加到答案中!
    • 嗨@Benoit!这行得通。谢谢!是的,应该是rows,而不是columns(我现在编辑了)另外,是的,我实际上是在计算平均差。
    • 顺便说一句,如果对包解决方案感兴趣,我的可以让你在最后一行写@tullio out[r,c] = (matrix[r+1,c] - matrix[r-1,c]) / 2,这更接近你在纸上写的内容,并且离 Matlab 更远。 (Xref github.com/mcabbott/Tullio.jl/issues/97 以相同方式编写其他行的障碍。)
    猜你喜欢
    • 2023-02-11
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多