Matlab: if-statement in anonymous functionsDennis Guse
UPDATE: The performance penalty is massive - MATLAB fails to optimize the code if anonymous functions or function handles are used. I got factor 20... But it works ;)
Today, I needed to write a function in Matlab as accessor to a matrix. I have a matrix which contain mulitple datastreams - one per row. The columns dimension is the time Because I don't want to change the functions, which evaluate only a subset of provided streams, and I don't want to copy and modify the matrix for every combination, I started to think about an accessor function. Furthermore the function should reveal the dimensions of the (not existing) data matrix. I ended up with anonymous functions, because these allow to access variables outside the anonymous function definition like:
1 a=2 2 b=2 3 fun=@(x)(a*x+b)
The advantage is that fun can use a and b, but the caller doesn't necessarily know that they exist and are used by fun. With this knowledge the implementation of providing the correct data was straight forward. The next problem was, that in anonymous function you can't use the if-statement. That's pretty messy. I found a (solution)[http://www.mathworks.com/matlabcentral/newsreader/view_thread/147044] and adapted it.
1 %%Artificial if for use in anonymous functions 2 %TRUE and FALSE are function handles. 3 function RESULT = iff(CONDITION,TRUE,FALSE) 4 if CONDITION 5 RESULT = TRUE(); 6 else 7 RESULT = FALSE(); 8 end 9 end
The function that creates the function handles of the accessor function:
1 function HANDLE = recordHandle(COLUMN, ROWS) 2 HANDLE = @(row, column) (... 3 iff(nargin == 2, @()COLUMN(ROWS(row), column), @()[size(COLUMN, 2), size(ROWS, 1)])... 4 ); 5 end