Message Boards Message Boards

Test for reals and integers in expression?

GROUPS:

To test that a numerical expression (typically a list of numbers) contains only reals, I wrote this function

ReV[expr_]:=VectorQ[expr,NumericalQ[#]&&(Head[#]===Real)&

Works fine. How do I extend this to test for the presence of only reals and integers? Changing the last (..) to

(Head[#]===Real||Head[#]===Integer) 

doesn't work.

POSTED BY: Carlos Felippa
Answer
9 days ago

There is no such thing as NumericalQ, I think you mean NumberQ or NumericQ?

ClearAll[ReV]
ReV[expr_]:=VectorQ[expr,NumberQ[#]&&(Head[#]===Real||Head[#]===Integer)&]
ReV[{1,2,3}]
ReV[{1.0,2.0,3.0}]
ReV[{1.0,2,3,4.0}]
ReV[{a,1.0,2,3,4.0}]
ReV[{Sqrt[2],1.0,2,3,4.0}]
ReV[{1/3,1.0,2,3,4.0}]
POSTED BY: Sander Huisman
Answer
9 days ago

There are useful (but undocumented) Internal` and Developer` context functions for such tasks. Take a look at Internal`RealValuedNumericQ.

VectorQ is specially optimized for most of these. For example, VectorQ[arr, Internal`RealValuedNumericQ] will immediately return True if arr is a Real or Integer packed array. It won't unpack and won't check each element.

These functions should really be documented.


The usual caveats for undocumented functions apply. If you misuse them, bad things might happen (such as kernel crash). They may not be tested to the same standards as documented functions. This is not just an empty disclaimer. I recently got bitten by a bug where VectorQ[{}, Developer`MachineIntegerQ] returned False up to Mathematica 10.4 (it's fixed in 11.0+).

POSTED BY: Szabolcs Horvát
Answer
9 days ago

My apologies, typing typos. Corrected:

ReV[expr_]:=VectorQ[expr,NumericQ[#]&&(Head[#]===Real)&]

I use it in older versions of Mathematica (4,5) as well as the latest (11) so it should work back to v4. (Sharing-code colleagues in Europe run 4 and 5)

POSTED BY: Carlos Felippa
Answer
9 days ago

@Carlos Felippa do you realize every time you make a post your code does not show up?

Could you please make sure you know the rules: https://wolfr.am/READ-1ST so moderators do not have to edit your every single post.

The rules explain how to format your code properly. If you do not format code, it may become corrupted and useless to other members. Please EDIT your posts and make sure code blocks start on a new paragraph and look framed and colored like this.

int = Integrate[1/(x^3 - 1), x];
Map[Framed, int, Infinity]

enter image description here

POSTED BY: Moderation Team
Answer
9 days ago

This works for me:

ReV[expr_] := 
 VectorQ[expr, ((Head[#] === Real) || (Head[#] === Integer)) &]

I recommend that you use parens when doing logicals because the order of precedence will sometimes cause unintended results.

Regards

POSTED BY: Neil Singer
Answer
8 days ago

Group Abstract Group Abstract