Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Functions with data hidden in them

  • To: mathgroup at smc.vnet.net
  • Subject: [mg81863] Re: Functions with data hidden in them
  • From: Hannes Kessler <HannesKessler at hushmail.com>
  • Date: Fri, 5 Oct 2007 04:50:44 -0400 (EDT)
  • References: <fe28v5$muq$1@smc.vnet.net>

Hello Neil,

here is a possible approach:

As an example, define a function of the single argument x. The
function depends on a given matrix m as parameter.
We can write this MyFunc[m_?MatrixQ][x_].
In the considered example, the function MyFunc[m] multiplies x with
the largest eigenvalue of the matrix m.
The function is defined as follows:

In[1]:=
MyFunc[m_?MatrixQ] := MyFunc[m] = Module[{eigenMax},
    eigenMax = Max  @  N  @  Eigenvalues  @  m;
    Unprotect  @  Function;
    Format[Times[eigenMax, #] &] :=
     MyFuncData[Short[m, 1], eigenMax];
    Protect  @  Function;
    Times[eigenMax, #] &
    ];

Repeated calculations of the eigenvalues of m are avoided by the
assignment in the assignment
MyFunc[m_?MatrixQ] := MyFunc[m] = Module[{eigenMax}, ...];
Obviously, the maximum eigenvalue has to be calculated only during the
first function call.
Furthermore, Format[Times[eigenMax, #] &] := ... achieves the wanted
formatting of the virtual function returned from the Module.
The virtual function can be applied then to different arguments x over
and over again.

Here are 2 matrices m1 and m2.

In[2]:=
m1 = {{10, 30, 40, 50, 60}, {30, 20, 50, 60, 70}, {40, 50, 30, 70,
    80}, {50, 60, 70, 40, 90}, {60, 70, 80, 90, 50}};
m2 = 20 m1;

Here we get the formatted virtual functions for m1 and m2:

In[4]:=
f1 = MyFunc[m1]
f2 = MyFunc[m2]

Out[4]:=
MyFuncData[{{10,30,40,50,60},{30,20,50,60,70},{<<1>>},{50,60,70,40,90},
{60,70,80,90,50}},280.327]

Out[5]:=
MyFuncData[<<1>>,5606.53]

And here, the functions are mapped on the elements of a vector

In[6]:=
f1  /@  {1, 2}

Out[8]:=
{280.327,560.653}

In[7]:=
f2  /@  {1, 2}

Out[7]:=
{5606.53,11213.1}

You may also have a look into the Splines package
c:\Programme\Wolfram Research\Mathematica\6.0\AddOns\Packages\Splines
\Splines.m

Best regards,
Hannes

On 4 Okt., 10:41, Neil Stewart <neil.stew... at warwick.ac.uk> wrote:
> The Interpolation[] function somehow "hides" the data passed to it in the
> InterpolationFunction object that it returns. In the example below, when
> f[1] is evaluated it is using information from the list data, but does not
> have the list data passed to it as parameter.
>
> In[1]:= data = {{1, 1}, {2, 2}, {3, 3}}
>
> In[2]:=  f = Interpolation[data]
>
> In[3]:= f[1]
> Out[3]= 1
>
> How can I write my own function that stores data inside itself in the same
> way that Interpolation does? I'm aiming to write a functions that takes a
> number as a parameter and consults a large data set to return a number. I'm
> not sure where to start - any ideas very welcome!
>
> Thanks,
> Neil.




  • Prev by Date: Re: Manipulate+Plot showing no output
  • Next by Date: What is the purpose of the Defer Command?
  • Previous by thread: Re: Functions with data hidden in them
  • Next by thread: Re: Functions with data hidden in them