2016-11-27 9 views
0

、私は、変数の変更を伝播するための方法を考えることはできません。CLOSEDオクターブ - 変数の変更の伝播オクターブ4.0.3では

 
> foo=5; 
> f=foo 
f = 5 
> foo=3; 
> f 
f = 5

同じことは、無名関数のために行く:

 
> foo=5; 
> [email protected](x) x+foo; 
> f(0) 
ans = 5 
> foo=3; 
> f(0) 
ans = 5    % f closes over the workspace 
> [email protected](x) x+foo;  % Reassign, causing a lookup of the value of foo 
> f(0) 
ans = 3

任意の方法ワークスペース(Geogebraのような)全体で変数の変更を伝播するには?

+1

「=」は変数に値を代入することを示し、2つの変数の等価ではありません。 – beaker

答えて

0

グローバル変数を使用して、名前付き関数内で '伝播'動作を得ることができます。

その後
global foo; 
function [a] = f(x) global foo; a = x+foo; end 

>> foo = 5 
>> f(0) 
ans = 5 
>> foo = 3; 
>> f(0) 
ans = 3 

help globalを参照してください。

それ以外の場合は、上記のコメントを参照してください。 =は値演算子の代入であり、 '参照によって'動作しません。

もう1つの方法は、evalin()を使用して別のスコープから変数をフェッチすることです。 help evalinを参照してください。次の関数は、上記の例と同じ出力を生成します。

function [a] = f(x) a = x+evalin('base','foo'); end 

最終的なメモ - 変数はネストされた関数を介して関数内で伝播できます。

function [] = f(x) 
    function [c] = g(y) 
     c = y + x; 
    end 
    disp(g(x)); 
    x=x+1; 
    disp(g(x)); 
end 
f(0) 
+0

これは私のために働いた、ありがとう。 –

+0

'evalin'は別のオプションであり、関数内で変数の伝搬が発生する可能性があります。ちょうどFYI。 – stephematician

関連する問題