Previous: , Up: Numeric Data Types   [Contents][Index]

### 4.8 Predicates for Numeric Objects

Since the type of a variable may change during the execution of a program, it can be necessary to do type checking at run-time. Doing this also allows you to change the behavior of a function depending on the type of the input. As an example, this naive implementation of `abs` returns the absolute value of the input if it is a real number, and the length of the input if it is a complex number.

```function a = abs (x)
if (isreal (x))
a = sign (x) .* x;
elseif (iscomplex (x))
a = sqrt (real(x).^2 + imag(x).^2);
endif
endfunction
```

The following functions are available for determining the type of a variable.

isnumeric (x)

Return true if x is a numeric object, i.e., an integer, real, or complex array.

Logical and character arrays are not considered to be numeric.

See also: isinteger, isfloat, isreal, iscomplex, ischar, islogical, isstring, iscell, isstruct, isa.

islogical (x)
isbool (x)

Return true if x is a logical object.

See also: ischar, isfloat, isinteger, isstring, isnumeric, isa.

isfloat (x)

Return true if x is a floating-point numeric object.

Objects of class double or single are floating-point objects.

See also: isinteger, ischar, islogical, isnumeric, isstring, isa.

isreal (x)

Return true if x is a non-complex matrix or scalar.

For compatibility with MATLAB, this includes logical and character matrices.

iscomplex (x)

Return true if x is a complex-valued numeric object.

See also: isreal, isnumeric, ischar, isfloat, islogical, isstring, isa.

ismatrix (a)

Return true if a is a 2-D array, i.e., `size (a)` returns `[M N]` with non-negative M and N.

See also: isscalar, isvector, iscell, isstruct, issparse, isa.

isvector (x)

Return true if x is a vector.

A vector is a 2-D array where one of the dimensions is equal to 1. As a consequence a 1x1 array, or scalar, is also a vector.

See also: isscalar, ismatrix, size, rows, columns, length.

isrow (x)

Return true if x is a row vector, i.e., `size (x)` returns `[1 N]` with non-negative N.

iscolumn (x)

Return true if x is a column vector, i.e., `size (x)` returns `[N 1]` with non-negative N.

isscalar (x)

Return true if x is a scalar, i.e., `size (x)` returns `[1 1]`.

issquare (x)

Return true if x is a square matrix, i.e., `size (x)` returns `[N N]` with non-negative N.

issymmetric (A)
issymmetric (A, tol)
issymmetric (A, `"skew"`)
issymmetric (A, `"skew"`, tol)

Return true if A is a symmetric or skew-symmetric matrix within the tolerance specified by tol.

The default tolerance is zero (uses faster code).

The type of symmetry to check may be specified with the additional input `"nonskew"` (default) for regular symmetry or `"skew"` for skew-symmetry.

Background: A matrix is symmetric if the transpose of the matrix is equal to the original matrix: `A == A.'`. If a tolerance is given then symmetry is determined by `norm (A - A.', Inf) / norm (A, Inf) < tol`.

A matrix is skew-symmetric if the transpose of the matrix is equal to the negative of the original matrix: `A == -A.'`. If a tolerance is given then skew-symmetry is determined by `norm (A + A.', Inf) / norm (A, Inf) < tol`.

ishermitian (A)
ishermitian (A, tol)
ishermitian (A, `"skew"`)
ishermitian (A, `"skew"`, tol)

Return true if A is a Hermitian or skew-Hermitian matrix within the tolerance specified by tol.

The default tolerance is zero (uses faster code).

The type of symmetry to check may be specified with the additional input `"nonskew"` (default) for regular Hermitian or `"skew"` for skew-Hermitian.

Background: A matrix is Hermitian if the complex conjugate transpose of the matrix is equal to the original matrix: `A == A'`. If a tolerance is given then the calculation is `norm (A - A', Inf) / norm (A, Inf) < tol`.

A matrix is skew-Hermitian if the complex conjugate transpose of the matrix is equal to the negative of the original matrix: `A == -A'`. If a tolerance is given then the calculation is `norm (A + A', Inf) / norm (A, Inf) < tol`.

isdefinite (A)
isdefinite (A, tol)

Return true if A is symmetric positive definite matrix within the tolerance specified by tol.

If tol is omitted, use a tolerance of `100 * eps * norm (A, "fro")`.

Background: A positive definite matrix has eigenvalues which are all greater than zero. A positive semi-definite matrix has eigenvalues which are all greater than or equal to zero. The matrix A is very likely to be positive semi-definite if the following two conditions hold for a suitably small tolerance tol.

```isdefinite (A) ⇒ 0
isdefinite (A + 5*tol, tol) ⇒ 1
```

isbanded (A, lower, upper)

Return true if A is a matrix with entries confined between lower diagonals below the main diagonal and upper diagonals above the main diagonal.

lower and upper must be non-negative integers.

isdiag (A)

Return true if A is a diagonal matrix.

See also: isbanded, istril, istriu, diag, bandwidth.

istril (A)

Return true if A is a lower triangular matrix.

A lower triangular matrix has nonzero entries only on the main diagonal and below.

See also: istriu, isbanded, isdiag, tril, bandwidth.

istriu (A)

Return true if A is an upper triangular matrix.

An upper triangular matrix has nonzero entries only on the main diagonal and above.

See also: isdiag, isbanded, istril, triu, bandwidth.

isprime (x)

Return a logical array which is true where the elements of x are prime numbers and false where they are not.

A prime number is conventionally defined as a positive integer greater than 1 (e.g., 2, 3, …) which is divisible only by itself and 1. Octave extends this definition to include both negative integers and complex values. A negative integer is prime if its positive counterpart is prime. This is equivalent to `isprime (abs (x))`.

If `class (x)` is complex, then primality is tested in the domain of Gaussian integers (https://en.wikipedia.org/wiki/Gaussian_integer). Some non-complex integers are prime in the ordinary sense, but not in the domain of Gaussian integers. For example, 5 = (1+2i)*(1-2i) shows that 5 is not prime because it has a factor other than itself and 1. Exercise caution when testing complex and real values together in the same matrix.

Examples:

```isprime (1:6)
⇒  0  1  1  0  1  0
```
```isprime ([i, 2, 3, 5])
⇒  0  0  1  0
```

Programming Note: `isprime` is appropriate if the maximum value in x is not too large (< 1e15). For larger values special purpose factorization code should be used.

Compatibility Note: matlab does not extend the definition of prime numbers and will produce an error if given negative or complex inputs.