如何将参数列表传递给Julia中的函数

如何将参数列表传递给Julia中的函数,julia,Julia,我是Julia语言的新手,教程还不是很深入,我不知道传递函数参数列表的最佳方法是什么。我的函数如下所示: function dxdt(x) return a*x**2 + b*x - c end _unpack(p::Params) = (p.a, p.b, p.c) myinstance = MyType([],0.0,0.0,0.0) 其中x是变量(2D数组),a、c和d是参数。据我所知,不建议在Julia中使用全局变量。那么什么是正确的方法呢? 这是一件事: function

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

function dxdt(x)
    return a*x**2 + b*x - c
end
_unpack(p::Params) = (p.a, p.b, p.c)
myinstance = MyType([],0.0,0.0,0.0)
其中x是变量(2D数组),a、c和d是参数。据我所知,不建议在Julia中使用全局变量。那么什么是正确的方法呢?

这是一件事:

function dxdt(x, a, b, c)
   a*x^2 + b*x + c
   end
或紧凑定义:

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

另请参见文档中的内容。

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

我可以这样做

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

function dxdt(x, p::Params)
    p.a*x^2 + p.b*x + p.c
end
有时,如果一个类型有多个字段,我会定义一个助手函数
\u unpack
(或任何您想命名的函数),如下所示:

function dxdt(x)
    return a*x**2 + b*x - c
end
_unpack(p::Params) = (p.a, p.b, p.c)
myinstance = MyType([],0.0,0.0,0.0)
然后我可以将
dxdt
的实现更改为

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

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

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实例,如下所示:

function dxdt(x)
    return a*x**2 + b*x - c
end
_unpack(p::Params) = (p.a, p.b, p.c)
myinstance = MyType([],0.0,0.0,0.0)
您可以更新
myinstance

myinstance.x = [1.0,2.8,9.0]
myinstance.a = 5
最后当
myinstance
准备好
dxxt

dxdt(myinstance)

对我来说,这听起来像是你在寻找的。例如:

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

您可以使用函数式语言的强大功能(函数作为一级对象和闭包):


感谢您的回答,但我只想传递变量x,同时以某种方式访问参数列表(我有许多参数要传递,因此将所有参数传递给函数将是一个非常糟糕的代码)。一个可能的选择是声明全局变量,但我知道Julia将无法优化具有太多全局变量的代码。@Ohm是您的用例吗?@GnimucKey这确实会帮助我,但我想我也会尝试使用类型定义,谢谢您的提示!如果参数列表很复杂,您可以使用和避免每次都传递整个列表。这与多次分派有什么关系?在本例中,没有什么关系,但如果您想定义一个不同版本的
dxdt
,在不同的参数集上操作,您将被设置为利用分派。我将修改响应的第一行a、b和c作为全局变量怎么样?您也可以将它们设置为常量,例如,
dxdt\u参数化(x,1,2,1)
。但一般来说,匿名函数(还)不是很有效。请参阅FastAnonymous.jl包。