Re: Test function argument with VectorQ and NumericQ
- To: mathgroup at smc.vnet.net
- Subject: [mg107326] Re: Test function argument with VectorQ and NumericQ
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Tue, 9 Feb 2010 02:45:52 -0500 (EST)
On 2/8/10 at 7:54 AM, janitor048 at googlemail.com (Oliver Fochler) wrote: >in order to get my NIntegrate running properly it seems that I need >to ensure that my functions actually take numeric arguments (without >NIntegrate trying to do some symbolic stuff before). >For a simple case something like >f[x_?NumericQ] := (stuff) >seems to work fine. However, I do use vectors (lists) as function >arguments, i.e. f[x_, y_]:= (stuff) needs to be called as f[ >{1,2,3}, 4]. How do I test this for numerical values? I know that I >can use VectorQ[ x, NumericQ ] to check whether x is a vector that >contains only numeric values. >But how do I combine this into a pattern test, that can be used in >an argument list? I would appreciate any help! You could use a conditional test instead of a pattern test. For example, In[7]:= f[x_?VectorQ] := Total[x] /; And @@ (NumericQ /@ x) In[8]:= f[RandomReal[1, 10]] Out[8]= 4.46125 In[9]:= f[{a, b, c}] Out[9]= f({a,b,c}) or if you prefer, In[11]:= g[x_?(VectorQ[#, NumericQ] &)] := Total[x] In[12]:= g[RandomReal[1, 10]] Out[12]= 3.52661 In[13]:= g[{a, b, c}] Out[13]= g({a,b,c}) Note, I've not tested these with large data sets. So, there may be significant execution speed differences between these two options.