another question : arrays of functions ???

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

another question : arrays of functions ???

Kay Hamacher
Hello.

There is another question which comes up by thinking
of a solution for an exercise :

Is there a way to declare arrays of functions ?

I think of the possibilities of Pascal :
Var a : Array[1..20] Of Function(x:Real) : Real;

and then do callings like
for i := 1 to 20 Do   b := b + a[i](3);

Kay

----------------------------------------------------------------------------
Kay Hamacher             InterNet : [hidden email]
WWW   http://www.wupper.de/sites/lucie/index.html

       WINDOWS : From the people who brought you edlin

Reply | Threaded
Open this post in threaded view
|

Re: another question : arrays of functions ???

A. Scottedward Hodel-2
The blessing and the curse of Octave and Matlab is that the basic data
type is a matrix, a 2x2 array of numbers.  John has already expanded that
somewhat by allowing for structures, and has also included a mode for
dealing with matrices that are string arrays (less convenient than
Matlab perhaps, but it does the job).

A kludgy way to do what you're discussing here would be to create an
array of strings containing function names, and then use eval to
evaluate each one independently, i.e.,

funclist(1,:) = "bessel";
funclist(2,1:5) = "gamma";
...

for ii-1:n
  x(i) = eval([setstr(funclist(i,:),'(x)']);
endfor

Matlab would require a similar approach, of course without the setstr
function call, which is unique to Octave.

Notice that the name of x must be in a string.

On Thu, 13 Jun 1996, Kay Hamacher wrote:

> Date: Thu, 13 Jun 1996 19:38:56 +0200 (MET DST)
> From: Kay Hamacher <[hidden email]>
> To: [hidden email]
> Subject: another question : arrays of functions ???
>
> Hello.
>
> There is another question which comes up by thinking
> of a solution for an exercise :
>
> Is there a way to declare arrays of functions ?
>
> I think of the possibilities of Pascal :
> Var a : Array[1..20] Of Function(x:Real) : Real;
>
> and then do callings like
> for i := 1 to 20 Do   b := b + a[i](3);
>
> Kay
>
> ----------------------------------------------------------------------------
> Kay Hamacher             InterNet : [hidden email]
> WWW   http://www.wupper.de/sites/lucie/index.html
>
>        WINDOWS : From the people who brought you edlin
>

A S Hodel Dept Elect Eng 200 Broun Hall, Auburn Univ., AL 36849
(334) 844-1854/fax-1809  http://www.eng.auburn.edu/~scotte


Reply | Threaded
Open this post in threaded view
|

Re: another question : arrays of functions ???

Ted.Harding
In reply to this post by Kay Hamacher
( Re Message From: Kay Hamacher )

>
> Status:  
>
> Hello.
>
> There is another question which comes up by thinking
> of a solution for an exercise :
>
> Is there a way to declare arrays of functions ?
>
> I think of the possibilities of Pascal :
> Var a : Array[1..20] Of Function(x:Real) : Real;
>
> and then do callings like
> for i := 1 to 20 Do   b := b + a[i](3);
>
> Kay

Octave does not provide for the declaration of arrays of functions in the
way Pascal (or C) does. You can, however, emulate it by constructing an
array of function names and using the "eval" function. But you need to
make sure that you "fudge" the function names to be all the same length in
the array. The function definitions would be given separately, and
individually, as in P or C.

For example:

function y = cos_2(x)
  t = cos(x); y = t.*t;
endfunction

function y = cos_3(x)
  t = cos(x); y = t.*t.*t;
endfunction

fn = ["  cos"; "cos_2"; "cos_3"];

x = [ 0.25 0.5 0.75 ];
y = [];
for i = 1: 3, t = eval ([ setstr( fn(i,:) ) "(x);" ]); y=[y;t] endfor

Best wishes,
Ted.                                    ([hidden email])

Reply | Threaded
Open this post in threaded view
|

Re: another question : arrays of functions ???

John W. Eaton-6
On 13-Jun-1996, Ted Harding <[hidden email]> wrote:

: Octave does not provide for the declaration of arrays of functions in the
: way Pascal (or C) does. You can, however, emulate it by constructing an
: array of function names and using the "eval" function. But you need to
: make sure that you "fudge" the function names to be all the same length in
: the array. The function definitions would be given separately, and
: individually, as in P or C.
:
: For example:
:
: function y = cos_2(x)
:   t = cos(x); y = t.*t;
: endfunction
:
: function y = cos_3(x)
:   t = cos(x); y = t.*t.*t;
: endfunction
:
: fn = ["  cos"; "cos_2"; "cos_3"];
:
: x = [ 0.25 0.5 0.75 ];
: y = [];
: for i = 1: 3, t = eval ([ setstr( fn(i,:) ) "(x);" ]); y=[y;t] endfor

You could simplify this a bit by using feval() instead of eval().

In the next release, the strings won't have be the same length, and
you will also be able to omit the call to setstr():

  octave:1> string_fill_char = setstr (0);  # Set fill char to ASCII nul.
  octave:2> fcns = ["cos"; "acos"]          # Lengths need not match.
  fcns =

  sin
  acos

  octave:3> for i = 1:2; feval (fcns (i,:), 0), end
  ans = 1
  ans = 1.5708

jwe

Reply | Threaded
Open this post in threaded view
|

another question : arrays of functions ???

Francesco Potorti`-9
On 13-Jun-1996, Ted Harding <[hidden email]> wrote:
 
 fn = ["  cos"; "cos_2"; "cos_3"];

I tried it on octave 1.1.1 precompiled for alpha and what I got is:

octave:6> fn = ["  cos"; "cos_2"; "cos_3"]
error: invalid conversion from string to real matrix
error: evaluating assignment expression near line 6, column 4

what's up?
--
Francesco Potorti`                  Voice:    +39-50-593203
Satellite Network Group             Operator: +39-50-593211
CNUCE-CNR, Via Santa Maria 36       Fax:      +39-50-904052(G3)/904051(G4)
56126 Pisa - Italy                  Email:    [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: another question : arrays of functions ???

Ted.Harding
( Re Message From: Francesco Potorti` )

>
> On 13-Jun-1996, Ted Harding <[hidden email]> wrote:
>  
>  fn = ["  cos"; "cos_2"; "cos_3"];
>
> I tried it on octave 1.1.1 precompiled for alpha and what I got is:
>
> octave:6> fn = ["  cos"; "cos_2"; "cos_3"]
> error: invalid conversion from string to real matrix
> error: evaluating assignment expression near line 6, column 4
>
> what's up?
> --
> Francesco Potorti`                  Voice:    +39-50-593203

I tried it on octave 1.1.1 precompiled for i386-linux (cut&paste
from my mail message to make sure it was the same) and it worked ...

I do have

        implicit_str_to_num_ok="true";

in my /usr/local/lib/octave/1.1.1/m/startup/octaverc. If I set this to
"false" then I get what you got.

All the best,
Ted.                                    ([hidden email])