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.