map
(map fun lis)
(map fun li1 li2)
のような map は
result = arrayfun(@fun, lis)
result = arrayfun(@fun, li1, li2)
と書ける。
関数の引数に関数を渡す時には @ を付ける。
上の例で@fun
ではなくfun
とすると、その場でのfunの呼び出しと見なされるため「関数funの引数が無い!」と怒られる。
で、arrayfun()
に無名関数を渡せると捗るよね。
lambda
(lambda (x) (+ x 1))
のような無名関数はOctaveでは
@(x) x+1
と書ける。
無名関数の中では、通常のOctave関数とは違い、引数以外の(無名関数の外側の)変数が使える。
a = [-0.3 0.5];
xs = rand(N, 1)*2 - 1;
ts = arrayfun(@(x)[1 x]*a', xs) + 0.2*randn(N, 1);
通常のOctave関数での「外側の変数」
動かない例。こういう風にクロージャ出来たら嬉しいんだけど出来ない。
a = 3;
function y = foo(x)
y = a*x;
endfunction
動く例。PHPみたいで嬉しくない。
global a = 3;
function y = foo(x)
global a;
y = a*x;
endfunction