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)
在朱莉娅,数字1
和1.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数字的表现非常不同,因此如果另一个没有特别有意义的话,通常只支持一个.其它语言不同,你需要知道之间的差异1
和1.0
.