help-octave
[Top][All Lists]

## Re: Order of Evaluation

 From: Mike Miller Subject: Re: Order of Evaluation Date: Mon, 19 Aug 2019 15:17:00 -0700 User-agent: Mutt/1.10.1 (2018-07-13)

```On Mon, Aug 19, 2019 at 20:56:00 +0200, address@hidden wrote:
> Dear List,
>
> consider the following functions (assumed free of side effects). The
> functions themself do not matter. Here are some simple examples for
> clearness:
>
>
> f = @(x) x .^ pi + log(x);   % ... some expression ...
> g = @(x) sin(x) * exp(-x/5); % ... another expression ...
> h = @(x) sqrt(x .^ cos(x));  % ... normally a costly (in time) expression ...
>
> % and last:
>
> y = @(x) f(h(x)) + g(h(x));
>
> % here h(x) will be evaluated twice. This is inefficient, especially
> % if y() is evaluated frequently (e.g. in finding roots or
> % integrating).
> %
> % Unfortunately Octave (like Matlab) does not have a sequence operator like C.
> % So constructs like the following lead to syntax errors:
>
> y = @(x) H = h(x), f(H) + g(H); % also wrong if in brackets
>
> % The only idea I found was:
>
> y = @(x) f(H = h(x)) + g(H);

You could try using eval or evalin to evaluate a compound expression
inside an anonymous function, for example

y = @(x) evalin ("caller", "H = h(x); f(H) + g(H)");

Couldn't you simply define another auxiliary y1 function, for example

y1 = @(x) f(x) + g(x);
y = @(x) y1(h(x));

Lastly, you could define y as a true function rather than an anonymous
function

function res = y(x); H = h(x); res = f(H) + g(H); endfunction

Is there a reason to constrain yourself to use only anonymous functions?

--
mike
``` signature.asc
Description: PGP signature