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

Why Julia Distribution package can't work with integer?

可以通过以下方式创建多元分布:

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

在 Julia 中,数字 11.0 是非常不同的东西。第一个是 Integer 类型,第二个是 FloatingPoint 类型。所以 [1, 1] 是一个整数数组,而 [1.0, 1.0] 是一个浮点数数组。

该错误消息准确地告诉您它不起作用的原因,但使用所有类型参数进行解析可能有点困难。

A MethodError 表示找不到具有匹配参数类型的方法。调用 convert(MvNormal{…}, ::Vector{Int}, ::Matrix{Float64} 失败。但是,您没有编写转换调用,因此它一定是在库中发生的。但是消息接着说 这可能是由于调用构造函数 而发生的。也就是说,它无法匹配 MvNormal{…}(::Vector{Int}, ::Matrix{Float64}) 形式的构造函数,因此它退回到试图将参数转换为类型而不是构造它的内置方法。那正是你写的!该方法不存在。

然后消息给你最接近的匹配方法:MvNormal(::Vector{Float64}, ::Matrix{Float64),它甚至突出显示与!Matched不匹配的参数。

那么,为什么它不起作用?因为没有人编写过允许整数向量的构造函数。但为什么不呢?在 Julia 中,Integers 和 FloatingPoint 数字的行为非常不同,因此通常仅在另一个没有特别意义的情况下才支持其中一个。与其他一些语言不同,您需要了解 11.0.

之间的区别