[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
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