在Julia中使用不同数量的参数迭代不同的函数

佩德罗·G。

我正在尝试对具有不同数量参数的不同函数进行循环。变量是在循环内的运行时创建的,我想在每次迭代中使用eval来使用变量:symbol实例化Struct。但是,我无法执行此操作,因为eval仅在全局范围内有效。这是适用的情况的MWE:

function f1(x); return x; end
function f2(x1,x2); return x1+x2; end

handles = [f1,f2]
args =[:(x1),:(x1,x2)]

x1 = 1; x2 = 1;
for (i,f) in enumerate(handles)
    params = eval(args[i])
    @show f(params...)
end

f(params...) = 1
f(params...) = 2

但是,如果我在循环中移动变量定义(这是我真正想要的),则在重新启动Julia清除工作区后它将无法工作。

function f1(x); return x; end
function f2(x1,x2); return x1+x2; end

handles = [f1,f2]
args =[:(x1),:(x1,x2)]

for (i,f) in enumerate(handles)
    x1 = 1; x2 = 1;
    params = eval(args[i])
    @show f(params...)
end

ERROR: UndefVarError: x1 not defined

我已经尝试了几个答案,例如这个,但是我似乎无法使它起作用。我可以编写一个使用[x1,x2]的自定义调度函数,并使用正确的参数调用f1或f2。但是,仍然有什么方法可以通过eval或替代的优雅解决方案来做到这一点?

编辑:这是我要在代码中尝试做的更多详细信息。我为每种算法都有一个配置结构,在这种情况下,我想事先定义它需要的参数

KMF_config = AlgConfig( 
    name = "KMF",
    constructor = KMC.KMF,
    parameters = :(mu,N,L,p),
    fit = KMC.fit!)
MF_config = AlgConfig( 
    name = "MF",
    constructor = KMC.MF,
    parameters = :(mu,N,L),
    fit = KMC.fit!)

alg_config_list = [KMF_config, MF_config]
for (i,alg_config) in enumerate(alg_config_list)
    mu,N,L,p,A,B,C,D,data = gen_vars() #this returns a bunch of variables that are used in different algorithms
    method = alg_config.constructor(eval(method.parameters)...)
    method.fit(data)
end

一种可能的解决方案是让一个函数接受所有变量和方法,并根据method.name返回一个带有变量子集的元组。但是我不确定这是否是最好的方法。

卡尔·莫里斯

这是一种使用多个调度而不是的方法eval

run_a(x, y) = x + 10*y
run_b(x, y, z) = x + 10*y + 100*z

extract(p, ::typeof(run_a)) = (p.x, p.y)
extract(p, ::typeof(run_b)) = (p.x, p.y, p.z)
genvars() = (x=1, y=2, z=3)

function doall()
    todo = [
        run_a,
        run_b,
    ]
    for runalg in todo
        v = genvars()
        p = extract(v, runalg)
        @show runalg(p...)
    end
end

在您的例子中,你将取代run_arun_bKMC.KMFKMC.MF

编辑:清理示例以避免您的示例中不存在的结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用#ifdef根据平台使用不同数量的函数参数

来自分类Dev

如何在Nim中使用不同的参数缓存函数?

来自分类Dev

在JavaScript中使用不同的线程在不同的参数中运行相同的函数

来自分类Dev

使用不同数量的参数运行 Powershell Cmdlet

来自分类Dev

在JMeter中使用不同数量的线程进行负载测试

来自分类Dev

如何在R中使用不同的参数多次运行函数?

来自分类Dev

在C ++中使用不同的项目文件将参数传递给函数

来自分类Dev

在不同的函数中使用相同的参数

来自分类Dev

如何在MySQL中使用不同的参数更新查询

来自分类Dev

在python中使用不同的按键调用不同的python函数

来自分类Dev

检查是否已使用不同的参数多次调用函数

来自分类Dev

使用不同的参数集“重载”纯虚函数

来自分类Dev

Ruby线程使用不同的参数调用相同的函数

来自分类Dev

使用不同的参数同时运行相同的函数

来自分类Dev

使用参数PyQt调用不同类的函数

来自分类Dev

使用不同的参数集“重载”纯虚函数

来自分类Dev

使用不同的参数集多次应用相同的函数

来自分类Dev

使用不同的参数并行运行函数-python

来自分类Dev

如何使用不同的参数并行化相同的函数?

来自分类Dev

使用不同的参数调用函数两次

来自分类Dev

在postgres中使用不同的日期和聚合函数

来自分类Dev

在C ++中使用不同的struct复制构造函数

来自分类Dev

在 Webpack 中使用不同的文件和函数

来自分类Dev

在.NET Core中使用不同的构造函数参数(DI和非DI)注册IHostedService的多个实例

来自分类Dev

用不同的测试参数化pytest函数

来自分类Dev

用不同的参数函数运行std :: thread

来自分类Dev

Python - 用不同的参数重载相同的函数

来自分类Dev

如何在Android中使用不同的参数格式化不同语言的字符串?

来自分类Dev

指向使用不同类型参数的不同函数的指针是否可以兼容?

Related 相关文章

  1. 1

    使用#ifdef根据平台使用不同数量的函数参数

  2. 2

    如何在Nim中使用不同的参数缓存函数?

  3. 3

    在JavaScript中使用不同的线程在不同的参数中运行相同的函数

  4. 4

    使用不同数量的参数运行 Powershell Cmdlet

  5. 5

    在JMeter中使用不同数量的线程进行负载测试

  6. 6

    如何在R中使用不同的参数多次运行函数?

  7. 7

    在C ++中使用不同的项目文件将参数传递给函数

  8. 8

    在不同的函数中使用相同的参数

  9. 9

    如何在MySQL中使用不同的参数更新查询

  10. 10

    在python中使用不同的按键调用不同的python函数

  11. 11

    检查是否已使用不同的参数多次调用函数

  12. 12

    使用不同的参数集“重载”纯虚函数

  13. 13

    Ruby线程使用不同的参数调用相同的函数

  14. 14

    使用不同的参数同时运行相同的函数

  15. 15

    使用参数PyQt调用不同类的函数

  16. 16

    使用不同的参数集“重载”纯虚函数

  17. 17

    使用不同的参数集多次应用相同的函数

  18. 18

    使用不同的参数并行运行函数-python

  19. 19

    如何使用不同的参数并行化相同的函数?

  20. 20

    使用不同的参数调用函数两次

  21. 21

    在postgres中使用不同的日期和聚合函数

  22. 22

    在C ++中使用不同的struct复制构造函数

  23. 23

    在 Webpack 中使用不同的文件和函数

  24. 24

    在.NET Core中使用不同的构造函数参数(DI和非DI)注册IHostedService的多个实例

  25. 25

    用不同的测试参数化pytest函数

  26. 26

    用不同的参数函数运行std :: thread

  27. 27

    Python - 用不同的参数重载相同的函数

  28. 28

    如何在Android中使用不同的参数格式化不同语言的字符串?

  29. 29

    指向使用不同类型参数的不同函数的指针是否可以兼容?

热门标签

归档