为任何整数数组定义函数



我想定义一个函数,该函数将其作为一个尺寸2的输入数组,该函数将整数(和唯一的整数(作为其元素。尽管我知道我不必指定朱莉娅功能的参数的类型,但我想这样做才能加快它的速度。

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


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

我不做什么来解决这个问题。一个选项是通过以下方式为整数的每个最低级子类型定义方法:

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

,但看起来不太实用。

首先:将输入参数的类型指定到函数的类型不是 加快代码。这是一个误解。定义结构时,应该指定具体字段类型,但是对于功能签名,它与性能无关。您使用它来控制调度。

现在,对于您的问题:朱莉娅的类型参数是不变的,这意味着即使 S<:T是正确的, A{S}<:A{T} not true。您可以在此处阅读更多信息:https://docs.julialang.org/en/v1/manual/types/index.html#parametric-compomposite-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

最新更新