Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call function for all elements in an array

Let's say I have a function, like:

function [result] = Square( x )
    result = x * x;
end

And I have an array like the following,

x = 0:0.1:1;

I want to have an y array, which stores the squares of x's using my Square function. Sure, one way would be the following,

y = zeros(1,10);

for i = 1:10
    y(i) = Square(x(i));
end

However, I guess there should be a more elegant way of doing it. I tried some of my insights and made some search, however couldn't find any solution. Any suggestions?

like image 378
Sait Avatar asked Dec 04 '22 13:12

Sait


1 Answers

For the example you give:

y = x.^2;   % or
y = x.*x;

in which .* and .^ are the element-wise versions of * and ^. This is the simplest, fastest way there is.

More general:

y = arrayfun(@Square, x);

which can be elegant, but it's usually pretty slow compared to

y = zeros(size(x));
for ii = 1:numel(x)
    y(ii) = Square(x(ii)); end

I'd actually advise to stay away from arrayfun until profiling has showed that it is faster than a plain loop. Which will be seldom, if ever.

In new Matlab versions (R2008 and up), the JIT accelerates loops so effectively that things like arrayfun might actually disappear in a future release.

As an aside: note that I've used ii instead of i as the loop variable. In Matlab, i and j are built-in names for the imaginary unit. If you use it as a variable name, you'll lose some performance due to the necessary name resolution required. Using anything other than i or j will prevent that.

like image 187
Rody Oldenhuis Avatar answered Dec 07 '22 01:12

Rody Oldenhuis