2017-08-02 5 views
0

関数dxdtを呼び出すにはどうすればよいですか?私は関数を呼び出すための引数としてpを定義する方法を知らない。Juliaの関数からパラメータリストを呼び出す方法

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

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

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

ここにあなたが何を求めているのかは分かりません。提供したコードはうまくいきます( 'a'、' b'、 'c'は' Number'のサブタイプです)。例えば ​​'dxdt(10、Params(1,2,3))'は 'a'、' b'、 'c'が' Int'ならば動作します。 –

+0

たとえばparamsには多くの変数があります。関数を呼び出すときに、すべての変数を書きたくない場合、どうすればよいですか? – ReD

+1

'dxdt(x、p :: Params)= p.a * x^2 + p.b * x + p.c' < - これは何か問題はありますか? –

答えて

1

あなたがタイプParamsの変数pを定義するだけでどのようにあなたの質問か? は= 1.0、B = 2.0、C = 3.0の場合:

次のように使用することができます
p = Params(1.0,2.0,3.0) 

type Params 
     a::Float64 
     b::Float64 
     c::Float64 
end 

p = Params(1.0,2.0,3.0) 

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

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

dxdt(1.0,p) 
6.0 

私はそれはあなたが求めているものだと思うが、私はありませんよ確かに。

1

チェックアウトParameters.jl。これには、より多くの砂糖と少ないタイピングでこれを行うためのマクロがあります。私はそれがあなたが探しているものだと思いますか?

using Parameters 

@with_kw type A 
    a::Int = 6 
    b::Float64 = -1.1 
    c::UInt8 
end 

# Safe Way 
function dxdt(x, p) 
    @unpack a,b,c = p # This works on any type 
    a*x^2 + b*x + c 
end 

# Easy Way 
function dxdt(x, p) 
    @unpack_A p # This only works on instances of A 
    a*x^2 + b*x + c 
end 
+0

なぜあなたは「安全な道」を教えていますか?どうやって最初の関数で '@ 'で関数を呼び出すのですか? – ReD

+1

一般的にはプログラミング時に明示的にする方が安全だと考えられています。 '@unpack_A p'は自動的にその値が解凍されたことを(その関数の内部で)伝えません。これは、事故時に何かを上書きする傾向があります。 –

関連する問題