suzuzusu日記

(´・ω・`)

MATLABの無名関数で分岐処理

MATLABでmap処理したいときに無名関数で分岐処理したいなと思ったら三項演算子もないしif文も使えないしどうすればいいのか調べてたらどうやらfeval使えばいいみたいなので使い方を忘備録として書く。

どうやらMATLABの無名関数は副作用のない純粋関数として設計されているらしい。

% 奇数の場合0を返し偶数の場合2倍にして返す関数
f = (@(num) ...
    feval((@ (list, index) list{index}), ...
             {0, num*2}, ...
             ( (mod(num, 2)==1)*1 + (mod(num, 2)==0)*2 )));

% arrayfunで配列の要素にfを適用させる
result = arrayfun(f, 1:100);

(mod(num, 2)==1)*1 + (mod(num, 2)==0)*2この奇数の場合1を返し偶数の場合1を返す式をindexとして{0, num*2}のcell配列に添え字としてアクセスしている。

参考

関数の計算 - MATLAB feval - MathWorks 日本

配列内の個々の要素に関数を適用 - MATLAB arrayfun - MathWorks 日本