Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 根据是否存在可选关键字参数设置函数输出类型_Julia - Fatal编程技术网

Julia 根据是否存在可选关键字参数设置函数输出类型

Julia 根据是否存在可选关键字参数设置函数输出类型,julia,Julia,我需要做一个柱状图,我的每个数据点都有一个统计权重。没有配备标准的hist功能来处理此问题。当然,我可以导入,它可以很好地处理加权数据,但我认为这是学习julia的一个很好的练习,可以尝试扩展hist()函数以接受权重作为可选(命名)参数 我从查看的julia源代码开始,并能够稍微修改它(如果是业余的话——欢迎改进建议),以使其正常工作: function sturges(n) # Sturges' formula n==0 && return one(n) i

我需要做一个柱状图,我的每个数据点都有一个统计权重。没有配备标准的
hist
功能来处理此问题。当然,我可以导入,它可以很好地处理加权数据,但我认为这是学习julia的一个很好的练习,可以尝试扩展
hist()
函数以接受权重作为可选(命名)参数

我从查看的julia源代码开始,并能够稍微修改它(如果是业余的话——欢迎改进建议),以使其正常工作:

function sturges(n)  # Sturges' formula
    n==0 && return one(n)
    iceil(log2(n))+1
end

function weightedhist!{HT}(h::AbstractArray{HT}, v::AbstractVector, edg::AbstractVector; init::Bool=true, weights::AbstractVector = ones(HT,length(v)))
    n = length(edg) - 1
    length(weights) == length(v) || error("length(weights) must equal length(v)")
    length(h) == n || error("length(h) must equal length(edg) - 1.")
    if init
        fill!(h, zero(HT))
    end
    for j=1:length(v)
        i = searchsortedfirst(edg, v[j])-1
        if 1 <= i <= n
            h[i] += weights[j]
        end
    end
    edg, h
end

weightedhist(v::AbstractVector, edg::AbstractVector; weights::AbstractVector = ones(Int,length(v))) = weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)
weightedhist(v::AbstractVector, n::Integer; weights::AbstractVector = ones(Int,length(v))) = weightedhist(v, histrange(v,n); weights=weights)
weightedhist(v::AbstractVector; weights::AbstractVector = ones(Int,length(v))) = weightedhist(v, sturges(length(v)); weights=weights)
然后
weightedhist(v,边;weights=w)
numpy.直方图(v,边,weights=w)
一致。如果我省略了权重的可选关键字参数,那么
weightedhist(v,edges)
与内置的
hist(v,edges)
一致,而
weightedhist(v)
与内置的
hist(v)
一致,除了当没有提供权重时,我的函数输出为浮点而不是整数

我不明白为什么会出现这种情况(h是否被创建为浮点数组?升级了?),我希望my函数在没有提供权重的情况下尽可能依赖内置数组的行为


有人能告诉我为什么我的函数要输出浮点,以及在没有提供权重的情况下,我如何将该行为更改为输出整数吗?我不希望先创建h数组,然后再将其从一种类型转换为另一种类型,因为我希望代码尽可能快。

如果我理解正确,当您调用

weightedhist(v, edges)
您正在使用底部三个“额外”定义中的第一个

这叫

weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)

所以在你的“main”
weightedhist中
参数化的
HT
将是
Float64
,因此
h
填充
HT
=
Float64
,因此
Float64
输出。因此,我相信将其更改为
Array(eltype(weights),length(edg)-1)
就足够了。

我最初尝试过,但当没有权重时,它会输出int,但当给出可选权重参数时,它会给我一个
不精确错误()
指向行
h[I]+=weights[j]
。哦,我明白了,这是有意义的(它试图在整数数组中填充浮点数,这是不安全的,因此是不精确的)。我已经更新了我的答案,使用
eltype
,应该可以处理它。
eltype
正是我需要的!工作得很好。谢谢!
weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)