在Julia中复制函数

问题描述 投票:1回答:1

我需要根据一个函数之前的定义来覆盖它,这导致了一个堆栈溢出错误.我已经尝试过用deepcopy(f),但它只是返回一个对f的引用,所以这不起作用.我需要能够反复做的是。

Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
Old(x) = deepcopy(New(x))
New(x) = updating_function(Old, Y2)
[...]

EDIT:我的总体目标是有一个函数,接受一个先验分布,然后吐出一个后验,由于我的应用,有一个不寻常的信号结构,一个简单的运行的例子是:

Old_pdf(x)= pdf(Uniform(),x)
Old_mean=0.5

function BU(d,low)
value, tol = quadgk(Old_pdf, Old_λ, 1)
truncated(λ)=d(λ)/value
end

Newpdf=BU(Old_pdf,Old_mean)
Old_mean, tol= quadgk(x -> Newpdf(x)*x, Old_mean, 1)
Old_pdf=BU(Old_pdf,Old_mean)

我知道这个例子可以用Distributions包中的函数来解决。但在我的应用中却不是这样。

我发现 这个问题 并阅读了IRTools包的文档,但我无法使其工作。特别是当我尝试

Old(x) = pdf(Uniform(),x)
New(x) = updating_function(Old, Y1)
const Old_ir= IRTools.Inner.code_ir(New, Tuple{Int})
Old(x) = IRTools.func(Old_ir)

我得到了一个不像函数的对象,因此在代码的其余部分产生了方法错误。我做了几次尝试,完全有可能是我遗漏了一些琐碎的东西。

function julia updating cloning
1个回答
2
投票
Y1 = 5.0
Y2 = 7.0
updating_function(f1,c) = x -> 2.0 * f1(x) + c
Old = x->sqrt(x)
New = updating_function(Old, Y1)
Old = New
New = updating_function(Old, Y2)

0
投票

我想你只是需要匿名函数。

function BU(f, λ, y)
    # I guess here you would use the observations `y` in some way?
    z, _ = quadgk(f, λ, 1)
    return λ -> f(λ) / z
end

mean(f, λ) = quadgk(x -> f(x) * x, λ, 1)[1]

original_pdf(x) = pdf(Uniform(), x)

f = original_pdf
λ = 0.5
for y in Y
   f = BU(f, λ, y)
   λ = mean(f, λ)
end

我已经很努力了,我想我明白你在做什么 但你举的例子不是很清楚。 考虑一下这个概念。

这种东西很好 褶皱顺便说一下

© www.soinside.com 2019 - 2024. All rights reserved.