Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab list comprehension

Can I write the following in a one liner?

x = [1,3,5,7,9]
res = zeros(1,size(x,2));
for i=1:size(x,2);
    res(i) = foo(x(i));
end;

Assume that the foo function does not handle arrays as expected. In my case foo returns a scalar even when giving an array as argument.

In Python, for instance, it would look like this:

x = [1,3,5,7,9]
res = [foo(y) for y in x]
like image 596
Lucy Brennan Avatar asked Jun 06 '12 16:06

Lucy Brennan


2 Answers

arrayfun is what you need. For example:

res = arrayfun(@foo, x)

Since foo always returns a scalar, the above will work and res will also be a vector of the same dimensions as x. If foo returns variable length output, then you will have to set 'UniformOutput' to false or 0 in the call to arrayfun. The output will then be a cell array.

like image 178
abcd Avatar answered Nov 18 '22 08:11

abcd


Just to add to the good answer of @yoda, instead of using UniformOutput, you can also use {} brackets:

res = arrayfun(@(t){foo(t)}, x)

Also, in some occasions, foo is already vectorized.

x = 1:10;
foo = @(t)(power(t,2));
res = foo(x);
like image 7
Andrey Rubshtein Avatar answered Nov 18 '22 10:11

Andrey Rubshtein