Matlab

今週と来週の学生実習はひたすらMatlabをいじるそうだ。
いろいろ試してみた↓。 それなりの(言語としての)機能はあるが、Rほど変態ではない。

クロージャ生成

Matlabでは動いた。Octave 3.0.5ではエラーが出て動かない。

function [ out0 ] = f(x)                                                                                                                                                               
  function [ out1 ] = g()                                                                     
    out1 = x;                                                                                 
  end                                                                                         
  out0 = @g;                                                                                  
end

a = f(0)
b = f(1)

a() %=> 0
b() %=> 1

高階関数

Octaveでしか試していないが、Matlabでも動くはず。

function mapped_list = map(fn, lis)                                                           
  len = length(lis);                                                                          
  mapped_list = 1 : len;                                                                      
  for i = 1 : len                                                                             
    mapped_list(i) = fn(lis(i));                                                              
  end                                                                                      
end

map(@abs, [1 -2 3 -4 5 0])                                                       
%ans =                                                                                         
%                                                                                              
%   1   2   3   4   5   0                                                                      
%                   
function res = reduce(fn, lis)                                                                
  len = length(lis);                                                                          
  acc = lis(len);                                                                             
  for i = (len - 1) : -1 : 1                                                                  
    acc = fn(lis(i), acc);                                                                    
  end                                                                                      
  res = acc;                                                                                  
end

reduce(@add, [1 2 3 4 5])                                                             
%ans =  15