【问题标题】:Defining function for any array of integers为任何整数数组定义函数
【发布时间】:2019-12-08 07:48:47
【问题描述】:

我想定义一个函数,该函数将任何具有整数(并且只有整数)作为其元素的维数为 2 的数组作为输入。虽然我知道我不必在 Julia 中指定函数的参数类型,但我想这样做是为了加快速度。

使用类型层次结构,我可以使用以下代码对将整数作为输入的函数执行此操作:


julia> function sum_two(x::Integer)
           return x+2
       end
sum_two (generic function with 1 method)

julia> sum_two(Int8(4))
6

julia> sum_two(Int16(4))

但是,当我尝试对 Array{Integer,2} 类型执行此操作时,我收到以下错误:

julia> function sum_array(x::Array{Integer,2})
           return sum(x)
       end
sum_array (generic function with 1 method)

julia> sum_array(ones(Int8,10,10))
ERROR: MethodError: no method matching sum_array(::Array{Int8,2})
Closest candidates are:
  sum_array(::Array{Integer,2}) at REPL[4]:2
Stacktrace:
 [1] top-level scope at none:0

我无法解决这个问题。一种选择是按以下方式为 Integer 的每个最低级别子类型定义方法:

function sum_array(x::Array{Int8,2})
           return sum(x)
       end

function sum_array(x::Array{UInt8,2})
           return sum(x)
       end
.
.
.

但是看起来不太实用。

【问题讨论】:

    标签: arrays function types julia


    【解决方案1】:

    首先:指定函数输入参数的类型不会加速代码。这是一种误解。您应该在定义结构时指定具体的字段类型,但对于函数签名,它对性能没有任何影响。你用它来控制调度。

    现在,对于您的问题:Julia 的类型参数是不变的,这意味着即使 S<:T 为真,A{S}<:A{T}为真。你可以在这里阅读更多信息:https://docs.julialang.org/en/v1/manual/types/index.html#Parametric-Composite-Types-1

    因此,ones(Int8,10,10),即Matrix{Int8}不是Matrix{Integer} 的子类型。

    要让您的代码正常工作,您可以这样做:

    function sum_array(x::Array{T, 2}) where {T<:Integer}
        return sum(x)
    end
    

    或者使用这个不错的快捷方式

    function sum_array(x::Array{<:Integer, 2})
        return sum(x)
    end
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 2013-06-16
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多