Re: Re: Which, If and "neither True nor False"
- To: mathgroup at smc.vnet.net
- Subject: [mg9877] Re: [mg9728] Re: Which, If and "neither True nor False"
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Sun, 30 Nov 1997 00:39:27 -0500
- References: <01bcfb4f$a6e45020$a90a5092@pehowland.dra.hmg.gb>
- Sender: owner-wri-mathgroup at wolfram.com
Re: [mg9728] Re: Which, If and "neither True nor False"
Paul Howland has sent me a solution by Robert Villegas to his original
question ("The If statement has an optional fourth argument which is
executed if the test returns neither True nor False. Is it possible to
do the same in a Which statement?"). I give two variations to this,
both faster.
Attributes[MyWhich]=HoldAll; (*Robert Villegas*) MyWhich[args___,
Indeterminate, indetValue_]:=
With[{evalWhich=Which[args]},
Switch[evalWhich,
_Which, indetValue,
otherwise_, evalWhich
]
]
MyWhich[args___] := Which[args]
Timing on test given below, 2.25 Second.
SetAttributes[MyWhich2, HoldAll]
MyWhich2[args___, Indeterminate, indetValue_] :=
Switch[#,
_Which, indetValue,
otherwise_, #
]&[Which[args]];
MyWhich2[args___] := Which[args]
Timing on test, 1.78333 Second
SetAttributes[MyWhich3, HoldAll]
MyWhich3[args___, Indeterminate, indetValue_] :=
Replace[Which[args],_Which->indetValue]; MyWhich3[args___] :=
Which[args]
Timing on test, 1.23333 Second
So, at least for this function, passing values with Function is quicker
than with With, and avoiding this passing by using Replace is best of
all.
The test used was
Do[{MyWhich[True,6],
MyWhich[False,6,Indeterminate,7],
MyWhich[xxx,6,Indeterminate,7]
},{1000}]//Timing//First
--
Allan Hayes
Mathematica Training and Consulting
Leicester, UK
hay at haystack.demon.co.uk
http://www.haystack.demon.co.uk
voice: +44 (0)116 271 4198
fax: +44 (0)116 271 4198