为什么Julia Distribution包不能用于整数?

Ale*_*hin 2 statistics distribution julia

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

using Distributions
rand(MvNormal([1, 1.], [1 .5; .5 1]), 2)
Run Code Online (Sandbox Code Playgroud)

但它不适用于整数:

using Distributions
rand(MvNormal([1, 1], [1 .5; .5 1]), 2)
Run Code Online (Sandbox Code Playgroud)

为什么?

PS第二个例子会抛出一个错误:

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
Run Code Online (Sandbox Code Playgroud)

Mat*_* B. 7

在朱莉娅,数字11.0非常不同的东西.第一个是Integer类型,第二个是FloatingPoint类型.因此[1, 1]是一个整数数组,而是[1.0, 1.0]一个浮点数的数组.

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

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

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

那么,为什么它不起作用?因为没有人编写过允许整数向量的构造函数.但为什么不呢?在Julia中,Integers和FloatingPoint数字的表现非常不同,因此如果另一个没有特别有意义的话,通常只支持一个.其它语言不同,你需要知道之间的差异11.0.