How to apply a function that returns non scalar output to arrays using arrayfun
?
For example - How to vectorize the following code?
array = magic(5);
A = cell(size(array));
for i=1:5
for j=1:5
A{i,j} = 1:array(i,j);
end
end
This naive attempt to vectorize does not work, because the output is not a scalar
array = magic(5);
result = arrayfun(@(x)(1:x),array);
There are 2 methods to achieve it:
It is possible to set 'UniformOutput' to false. Then, the result is a cell array.
But there is a nice trick that I have found today, the function itself can return a cell. This removes the need of typing
'UniformOutput',false
each and every time.What is really interesting here that I don't have to type
@(X)({1:x})
but I can define it only by using curly bracers@(X){1:x}
Edit(1): As @Jonas correctly points out, there is no wonder that the regular bracers
()
are not needed, as they are optional. For example,@(x) x+1
is a valid syntax.Edit(2): There is a small difference between using the curly bracers method or the
UniformOutput,false
. When the input array is empty, their behavior is different.In addition to the answer of Andrey I want to note that it seems, that the first approach, using the option UniformOutput, is slightly faster: