【问题标题】:How to pass parameter list to a function in Julia如何将参数列表传递给Julia中的函数
【发布时间】:2015-10-06 13:47:00
【问题描述】:

我是 Julia 语言的新手,教程还不是很深,我不明白传递函数参数列表的最佳方法是什么。我的函数如下所示:

function dxdt(x)
    return a*x**2 + b*x - c
end

其中 x 是变量(二维数组),a、c 和 d 是参数。据我了解,不建议在 Julia 中使用全局变量。那么正确的做法是什么?

【问题讨论】:

标签: julia


【解决方案1】:

惯用的解决方案是创建一个类型来保存参数并使用多个调度来调用正确版本的函数。

这就是我可能会做的事情

type Params
    a::TypeOfA
    b::TypeOfB
    c::TypeOfC
end

function dxdt(x, p::Params)
    p.a*x^2 + p.b*x + p.c
end

有时,如果一个类型有很多字段,我会定义一个辅助函数 _unpack(或任何你想命名的名称),如下所示:

_unpack(p::Params) = (p.a, p.b, p.c)

然后我可以将dxdt 的实现更改为

function dxdt(x, p::Params)
    a, b, c = _unpack(p)
    a*x^2 + b*x + c
end

【讨论】:

  • 这和多分派有什么关系?
  • 在这个例子中什么都没有,但是如果你想定义一个不同版本的dxdt 来操作不同的参数集,你将全部设置为利用调度。我将修改响应的第一行
【解决方案2】:

你可以使用函数式语言的力量(函数作为一等对象和闭包):

julia> compose_dxdt = (a,b,c) -> (x) -> a*x^2 + b*x + c #creates function with 3 parameters (a,b,c) which returns the function of x
(anonymous function)

julia> f1 = compose_dxdt(1,1,1) #f1 is a function with the associated values of a=1, b=1, c=1
(anonymous function)

julia> f1(1) 
3

julia> f1(2)
7

julia> f2 = compose_dxdt(2,2,2) #f1 is a function with the associated values of a=2, b=2, c=2
(anonymous function)

julia> f2(1)
6

julia> f2(2)
14

【讨论】:

    【解决方案3】:

    这是一件事:

    function dxdt(x, a, b, c)
       a*x^2 + b*x + c
       end
    

    或紧凑的定义:

    dxdt(x, a, b, c) = a*x^2 + b*x + c
    

    另请参阅文档中的 argument passing in functions

    【讨论】:

    • 感谢您的回答,但我只想传递变量 x,同时以某种方式访问​​参数列表(我有很多参数要传递,因此将所有参数传递给函数将是一个非常讨厌的代码)。一种可能的选择是声明全局变量,但我知道 Julia 将无法优化具有太多全局变量的代码..
    • @Ohm 是 this 你的用例吗?
    • @GnimucKey 这确实对我有帮助,但我想我也会尝试使用类型定义,谢谢你的提示!
    【解决方案4】:

    您真正想做的是将数据结构(复合数据类型)的实例传递给您的函数。 为此,首先设计您的数据类型:

    type MyType
      x::Vector
      a
      b
      c
    end
    

    并实现dxtd函数:

    function dxdt(val::MyType)
      return val.a*val.x^2 + val.b*val.x + val.c
    end
    

    然后在代码中的某个位置创建 MyType 的实例,如下所示:

    myinstance = MyType([],0.0,0.0,0.0)
    

    你可以更新myinstance

    myinstance.x = [1.0,2.8,9.0]
    myinstance.a = 5
    

    最后当myinstance准备好迎接dxxt

    dxdt(myinstance)
    

    【讨论】:

      【解决方案5】:

      在我看来,您正在寻找anonymous functions。例如:

      function dxdt_parametric(x, a, b, c)
         a*x^2 + b*x + c
      end
      
      a = 1
      b = 2
      c = 1
      
      julia> dxdt = x->dxdt_parametric(x, a, b, c)
      (anonymous function)
      
      julia> dxdt(3.2)
      17.64
      

      【讨论】:

      • a、b、c 是全局变量呢?
      • 您也可以将它们设为常量,例如dxdt_parametric(x, 1, 2, 1)。但总的来说,匿名函数(还)不是很有效。请参阅 FastAnonymous.jl 包。
      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2018-03-13
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多