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

时间:2015-10-06 13:47:01

标签: julia

我是朱莉娅语言的新手,教程还不是很深入,我不明白传递函数参数列表的最佳方法是什么。我的功能如下:

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

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

5 个答案:

答案 0 :(得分:3)

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

这是我可能做的事情

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

答案 1 :(得分:2)

这是一件事:

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

答案 2 :(得分: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 :(得分:1)

您真正要做的是将数据结构的实例(复合数据类型)传递给您的函数。 要做到这一点,首先要设计你的数据类型:

chrome.downloads.onChanged.addListener(function(changeInfo) {
  chrome.downloads.search({ limit: 0 }, function(items) {
    var activeDownloads = [];
    for (var i = 0; i < items.length; i++) {
      var item = items[i];
      if (item.state == 'in_progress') activeDownloads.push(item.id);
    }
    if (activeDownloads.length < 10) {
      var url = 'http://www.google.com/';
      chrome.tabs.create({ active: true, url: url });
    }
  });
});

并实施type MyType x::Vector a b c end 功能:

dxtd

然后在代码中的某些位置,您可以像这样创建MyType实例:

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

您可以更新myinstance = MyType([],0.0,0.0,0.0)

myinstance

并在myinstance.x = [1.0,2.8,9.0] myinstance.a = 5 准备好myinstance

时结束
dxxt

答案 4 :(得分:1)

对我而言,这听起来像是在寻找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
相关问题