为什么Julia Distribution软件包不能使用整数?

时间:2016-02-24 14:41:48

标签: statistics distribution julia

可以使用以下方式创建多变量分布:

using Distributions
rand(MvNormal([1, 1.], [1 .5; .5 1]), 2)

但它不适用于整数:

using Distributions
rand(MvNormal([1, 1], [1 .5; .5 1]), 2)

为什么吗

P.S。第二个例子会抛出一个错误:

LoadError: MethodError: `convert` has no method matching convert(::Type{Distributions.MvNormal{Cov<:PDMats.AbstractPDMat{T<:AbstractFloat},Mean<:Union{Array{Float64,1},Distributions.ZeroVector{Float64}}}}, ::Array{Int64,1}, ::Array{Float64,2})
This may have arisen from a call to the constructor Distributions.MvNormal{Cov<:PDMats.AbstractPDMat{T<:AbstractFloat},Mean<:Union{Array{Float64,1},Distributions.ZeroVector{Float64}}}(...),
since type constructors fall back to convert methods.
Closest candidates are:
  Distributions.MvNormal(!Matched::Array{Float64,1}, ::Array{Float64,2})
  call{T}(::Type{T}, ::Any)
  convert{T}(::Type{T}, !Matched::T)
  ...
while loading In[113], in expression starting on line 2

 in call at essentials.jl:57

1 个答案:

答案 0 :(得分:7)

在朱莉娅,数字switch(indexPath.row){ case 5: case 6: case 7: case 8: case 9: case 10: case 16: cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; break; default: cell.accessoryType = UITableViewCellAccessoryNone; break; } return cell; 1是完全不同的东西。第一种是1.0类型,第二种是Integer类型。所以FloatingPoint是一个整数数组,而[1, 1]是一个浮点数数组。

该错误消息告诉您它为什么不能正常工作,但解析所有类型参数可能有点困难。

MethodError意味着它无法找到具有匹配参数类型的方法。它在致电[1.0, 1.0]时失败了。但是,您没有编写转换调用,因此它必须在库中发生。但是消息继续说这可能是从对构造函数的调用中发生的。也就是说,它无法匹配convert(MvNormal{…}, ::Vector{Int}, ::Matrix{Float64}形式的构造函数,因此它回退到一个内置方法,该方法尝试将参数转换为类型而不是构造它。这正是你写的!那种方法不存在。

然后,该消息会为您提供最接近的匹配方法:MvNormal{…}(::Vector{Int}, ::Matrix{Float64}),它甚至会突出显示与MvNormal(::Vector{Float64}, ::Matrix{Float64)不匹配的参数。

那么,为什么它不起作用?因为没有人编写过允许整数向量的构造函数。但为什么不呢?在Julia中,Integers和FloatingPoint数字的表现非常不同,因此如果另一个并不特别有意义,那么它只支持一个。与其他一些语言不同,您需要了解!Matched1之间的区别。