我是朱莉娅语言的新手,教程还不是很深入,我不明白传递函数参数列表的最佳方法是什么。我的功能如下:
function dxdt(x)
return a*x**2 + b*x - c
end
其中x是变量(2D数组),a,c和d是参数。据我所知,不建议在Julia中使用全局变量。那么正确的做法是什么?
答案 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