LoginSignup
3
1

More than 5 years have passed since last update.

Octaveでmapとかlambdaとか

Posted at

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1