在 Julia 中迭代具有不同数量参数的不同函数

2024-04-09

我正在尝试使用不同数量的参数对不同的函数运行循环。变量是在运行时在循环内创建的,我想在每次迭代时使用 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

我尝试过几个答案,例如this one https://stackoverflow.com/questions/21267962/how-can-i-eval-a-local-variable-in-julia,但我似乎无法让它发挥作用。我可以编写一个自定义调度函数,它接受 [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_a and run_b with KMC.KMF and KMC.MF.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Julia 中迭代具有不同数量参数的不同函数 的相关文章

随机推荐

  • 无法确定要使用哪个版本的 ASP.NET 网页

    我的 VS2013 项目发生了奇怪的事情 我最近将我的项目分支之一从 NET 4 0 升级到 4 5 1 并使用 NuGet 包管理器安装带有 Razor 的 MVC 5 这样我就可以拥有 WebForms MVC 混合体 到目前为止 它运
  • Wpf GridSplitter 替换 row.height 属性上的绑定

    我在网格分割器方面遇到了困难 我已经绑定了RowDefinition Height模型的 clr 属性的依赖属性 如下所示
  • 有没有办法将 jq 输出到 bash 脚本的多个变量中?

    基本上我有一个 bash 脚本 它在某一时刻进行 API 调用 并生成证书和密钥并以 json 形式返回 我将其通过管道传输到 jq 并可以选择证书或密钥并将其存储在变量中 像这样的事情 CERT API call jq r certifi
  • Go 运行时错误:“分配给 nil 映射中的条目”

    我是 go lang 的新手 我正在尝试读取 csv 文件并收集数据 但运行后我得到了这个错误 panic assignment to entry in nil map goroutine 1 running panic 0x4dedc0
  • 登录 DBCP

    我正在使用 Apache Commons DBCP 有一个任务来跟踪 DBCP 的内部行为 活动和空闲连接的数量 我发现 DBCP 根本没有任何此类日志记录 是的 当从池中借用连接时 可以编写输出 BasicDataSource 状态的代码
  • 替换 JQueryUI 对话框的关闭图标

    经过对这个主题的广泛搜索后 我无法找到答案 所以希望有人可以帮助我解决这个问题 我有一个相对基本的对话框 dialog search dialog resizable false height dimensionData height wi
  • 使用掺杂向量访问多维数组的任意轴向切片?

    我正在构建一套功能来与多维数组数据结构 https stackoverflow com questions 30023867 how can i work with dynamically allocated arbitrary dimen
  • “enum class”是 C++ 中的类类型吗?

    我读到了 C 中的枚举声明 使用参考参数 http en cppreference com w cpp language enum 然后我做了枚举类并使用检查它是否是类类型std is class include
  • 有没有更简单的方法来访问 R 中类的属性,我可以使用点表示法吗?

    我在 R 中创建了一个包含多个属性的对象 我怎样才能轻松访问它们 我可以 attr x attributeName or attributes x attributeName 但它们都不是真正方便的 有没有更快的方法 如 C 或 Java
  • 无法让属性字符串在 Swift 中工作

    我试图在代码中设置字符串的一些属性 但无法得到NSAttributedString上班 这是应该更改字符串的函数 func getAttributedString string String gt NSAttributedString va
  • 实体框架代码首先迁移抛出错误

    这是我在收到此错误之前所做的操作 安装了 EF 预发布版本 可能是 6 我不知道 决定我不想要 所以卸载它并重新安装稳定版本 5 通过 SSMS 截断我的数据库 这是错误 Exception calling CreateInstanceFr
  • 使用 Spring MVC 应用程序实现 Tiles 3

    我正在尝试在 Spring MVC 应用程序中实现 Apache Tiles 3 因此我在 pom xml 文件中添加了以下依赖项
  • 对多索引 pandas 数据帧上的重复行求和

    你好 我在处理熊猫方面遇到了麻烦 我正在尝试对多索引数据帧上的重复行进行求和 我尝试过df groupby level 0 1 sum 还与df stack reset index groupby year product sum 和其他一
  • Typeorm .loadRelationCountAndMap 返回零

    请帮忙 我正在尝试执行以下 typeorm 查询 return await getRepository Company createQueryBuilder Company leftJoinAndSelect Company plants
  • 在另一个绘图的绘图区域内添加小直方图

    有没有办法在另一个图的绘图区域内添加直方图 但独立于 基础 图的坐标系 就我而言 我想将直方图作为图例添加到分区统计图 直方图将显示属于每个类别的区域数量 但问题可以轻松应用于任何绘图 例如 plot 1 10 rect 1 7 4 9 c
  • pandas DataFrame 中每一行的操作

    我想迭代 pandas DataFrame 中的每一行 并对每行中的元素执行一些操作 现在我有 for row in df iterrows if row col gt 1 5 doSomething 但它告诉我 元组索引必须是整数 而不是
  • 从 C# 打开 Google Chrome 的新窗口

    可以开新的instance来自 C 的 Chrome By instance我的意思是一个新的单独选项卡 不包含在现有的 Chrome 窗口中 我尝试过以下解决方案但是both他们创造了一个new tab in an existingchr
  • MongoDB - 返回插入项的 id

    从以下教程开始 https codeforgeek com 2015 08 restful api node mongodb https codeforgeek com 2015 08 restful api node mongodb 我有
  • MinGW GCC 通配符

    我在 Windows 上使用 MinGW GCC 编译器如何编译目录中的所有 C 文件 I used gcc c o Output 在我输入所需的文件夹后出现此错误 gcc error c Invalid argument gcc fata
  • 在 Julia 中迭代具有不同数量参数的不同函数

    我正在尝试使用不同数量的参数对不同的函数运行循环 变量是在运行时在循环内创建的 我想在每次迭代时使用 eval 来使用变量 symbol 实例化一个 Struct 但是 我不能这样做 因为 eval 只在全局范围内有效 这是有效案例的 MW