gpt4 book ai didi

function - Julia 创建一个函数的多个稍作修改的版本

转载 作者:行者123 更新时间:2023-12-03 06:38:03 26 4
gpt4 key购买 nike

我有一个看起来像的函数

function eom!(du, u, p)
@views a, b = u[:,1], u[:,2];
@views da, db = du[:,1], du[:,2];

y = # some stuff involving p and a;
da .= f(a, b, y);
db .= g(b, a);
end

我现在想创建第二个完全相同的函数,除了最后一行内容

db .= g(b, y);

我怎样才能最干净地做到这一点?当然,我可以复制并粘贴并给函数赋予稍微不同的名称,但这似乎不理想,特别是如果我稍后想要更多函数,其中 g 的第二个参数可能是别的。也许有一种方法可以让我将一个表达式(通过参数 p)传递到函数 eom! 中,该表达式将指定 g 的第二个参数>?或者有没有办法让我可以制作一些可以输出我想要的所有函数的函数 eom_generator ?也许宏是执行此操作的核心工具,但我不确定。

最佳答案

你可以产生一个闭包:

function eom_generator(g)
return function eom!(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]

y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= g(a, b, y)
end
end

const eom1! = eom_generator((a, b, y) -> g(b, a))
const eom2! = eom_generator((a, b, y) -> g(b, y))

但由于这是微分方程的核心,因此请务必测试这样是否没有任何性能问题。

如果您确定确实需要元编程,则可以在循环中使用@eval:

for (i, expr) in enumerate((:(g(b, a)), :(g(b, y))))
@eval function $(Symbol("eom", i, "!"))(du, u, p)
@views a, b = u[:,1], u[:,2]
@views da, db = du[:,1], du[:,2]

y = nothing # some stuff involving p and a;
da .= f(a, b, y)
db .= $expr
end
end
end

关于function - Julia 创建一个函数的多个稍作修改的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60222855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com