Re: Making a function dynamically define another conditional function...
- To: mathgroup at smc.vnet.net
- Subject: [mg21762] Re: [mg21733] Making a function dynamically define another conditional function...
- From: "David Park" <djmp at earthlink.net>
- Date: Thu, 27 Jan 2000 22:56:42 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Paul,
Here are two approaches:
cdata = {{1, 2}, {3, 4}, {5, 6}};
definef[data_] :=
(Clear[f];
f[x_] :=
Switch[x,
Evaluate[
Sequence @@
Flatten[Join[
Transpose[MapAt[# + x &, Transpose[data], 2]], {{_, 0}}]]]])
definef[cdata]
f /@ Range[5]
{3, 0, 7, 0, 11}
The second approach:
definef2[data_] :=
Module[{i},
Clear[f];
f[x_] =
Sum[KroneckerDelta[x - data[[i, 1]]](x + data[[i, 2]]), {i, 1,
Length[data]}]
]
definef2[cdata]
f /@ Range[5]
{3, 0, 7, 0, 11}
The only disadvantage here is that the function returns 0 for a non-match. Maybe
someone can show how to make it return f[x].
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
>
>How can I make a function dynamically define a conditional function?
>
>Given a list of arguments {{a,A}, {b,B}, ...} I want to write a function
>that will take these arguments, and generate a new function, f say,
>which is defined as (for example):
> f[x_] := x+a /; x==A
> f[x_] := x+b /; x==B
> etc.
>
>So, the obvious solution is to define a function as follows:
>
>In[1] := TestFn[data_List] := Module[{args},
> ClearAll[f];
> Do[
> args = data[[i]];
> f[x_] = x + args[[1]] /; x==args[[2]],
> {i, Length[data]}
> ]]
>
>and call it using something like TestFn[{{1,2},{3,4},{5,6}}].
>
>But this doesn't work (see attached notebook) as it appears that
>Mathematica does not evaluate any part of the condition at the time of
>definition, so args[[2]] remains unevaluated. As a consequence, the
>resulting function definition is not properly defined.
>
>So, the obvious solution to this is to wrap Evaluate[] around the
>condition (i.e. define the function as f[x_] = x + args[[1]] /;
>Evaluate[x == args[[2]]]. And this appears to work. If you do ?f, then
>you see a function comprising a number of conditional definitions.
>However, if you come to use the function, then it appears that
>Mathematica does not perform the condition test that appears in the
>definition! It simply uses the first definition it finds.
>
>What is going on?! How can I make this work?
>
>I attach a notebook with example code. [Contact Paul to
>get this notebook - Moderator]
>
>Many thanks for any help.
>
>Paul
>
>