我有这个简单的方法来计算向量集合的加权平均值
function meanw{T <: Number}(x::AbstractArray{AbstractVector{T}, 1}, w::AbstractVector{T})
x? = sum(x .* w)
x? = map(z -> z - x?, x)
x?, x?
end
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用它时,调度与我的方法不匹配.
ERROR: `meanw` has no method matching meanw(::Array{Array{Float64,1},1}, ::Array{Float64,1})
Run Code Online (Sandbox Code Playgroud)
我怀疑在涉及嵌套时我误解了如何使用类型限制.我应该如何重写此功能以匹配我的收藏?
PS
我知道矢量和数组是相同的,但差异化使得函数的使用更加清晰.
因此,如果您重写代码以使用具体类型,它就可以工作
\n\nfunction meanw{T <: Number}(x::Array{Vector{T}, 1}, w::Vector{T})\n x\xcc\x84 = sum(x .* w)\n x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n x\xcc\x84, x\xcc\x83\nend\nRun Code Online (Sandbox Code Playgroud)\n\n这也有效
\n\nfunction meanw{T <: Number}(x::Array{Vector{T}, 1}, w::AbstractVector{T})\n x\xcc\x84 = sum(x .* w)\n x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n x\xcc\x84, x\xcc\x83\nend\nRun Code Online (Sandbox Code Playgroud)\n\n这不起作用
\n\nfunction meanw{T <: Number}(x::Array{AbstractVector{T}, 1}, w::AbstractVector{T})\n x\xcc\x84 = sum(x .* w)\n x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n x\xcc\x84, x\xcc\x83\nend\nRun Code Online (Sandbox Code Playgroud)\n\n这又起作用了
\n\nfunction meanw{T <: Number}(x::AbstractArray{Vector{T}, 1}, w::AbstractVector{T})\n x\xcc\x84 = sum(x .* w)\n x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n x\xcc\x84, x\xcc\x83\nend\nRun Code Online (Sandbox Code Playgroud)\n\n我们这里遇到的问题在 Julia 手册的参数类型下有描述
\n\n\n\n\n最后一点非常重要:
\n\n即使 Float64 <: Real 我们也没有 Point{Float64} <:\n Point{Real}。
\n\n换句话说,用类型论的说法,Julia\xe2\x80\x99 的类型参数是不变的,而不是协变的(甚至是逆变的)。这是出于实际原因:虽然 Point{Float64} 的任何实例在概念上也可能类似于 Point{Real} 的实例,但这两种类型在内存中具有不同的表示形式:
\n
真正起作用的是这个
\n\nfunction meanw{T <: Number, V <: AbstractVector}(x::AbstractArray{V, 1}, w::AbstractVector{T})\n x\xcc\x84 = sum(x .* w)\n x\xcc\x83 = map(z -> z - x\xcc\x84, x)\n x\xcc\x84, x\xcc\x83\nend\nRun Code Online (Sandbox Code Playgroud)\n\n但真正的问题是你为什么要这样做?\n只要输入类型正确并且函数本身类型稳定,即使没有类型注释,Julia 编译器也足够聪明,可以生成高效的代码。只有多重分派才真正需要类型注释,并且作为指定函数实际可以处理的内容的契约,但由于类型系统广泛,这在 Julia 中是非常困难的。
\n| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |