Check if expression contains particular subexpression
has(
returns
logical expr
,subexpr
)1
(true) if expr
contains subexpr
.
Otherwise, it returns logical 0
(false).
If expr
is an array, has(expr,subexpr)
returns
an array of the same size as expr
. The returned
array contains logical 1s
(true) where the elements
of expr
contain subexpr
,
and logical 0s
(false) where they do not.
If subexpr
is an array, has(expr,subexpr)
checks
if expr
contains any element of subexpr
.
Use the has
function to
check if an expression contains a particular variable or subexpression.
Check if these expressions contain variable z
.
syms x y z has(x + y + z, z)
ans = logical 1
has(x + y, z)
ans = logical 0
Check if x + y + z
contains the following
subexpressions. Note that has
finds the subexpression x
+ z
even though the terms x
and z
do
not appear next to each other in the expression.
has(x + y + z, x + y) has(x + y + z, y + z) has(x + y + z, x + z)
ans = logical 1 ans = logical 1 ans = logical 1
Check if the expression (x + 1)^2
contains x^2
.
Although (x + 1)^2
is mathematically equivalent
to the expression x^2 + 2*x + 1
, the result is
a logical 0
because has
typically
does not transform expressions to different forms when testing for
subexpressions.
has((x + 1)^2, x^2)
ans = logical 0
Expand the expression and then call has
to
check if the result contains x^2
. Because expand((x
+ 1)^2)
transforms the original expression to x^2
+ 2*x + 1
, the has
function finds the
subexpression x^2
and returns logical 1
.
has(expand((x + 1)^2), x^2)
ans = logical 1
Check if a symbolic expression contains any of subexpressions specified as elements of a vector.
If an expression contains one or more of the specified subexpressions, has
returns
logical 1
.
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), sin(x), exp(x)])
ans = logical 1
If an expression does not contain any of the specified subexpressions, has
returns
logical 0
.
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), exp(x)])
ans = logical 0
Using has
, find those
elements of a symbolic matrix that contain a particular subexpression.
First, create a matrix.
syms x y M = [sin(x)*sin(y), cos(x*y) + 1; cos(x)*tan(x), 2*sin(x)^2]
M = [ sin(x)*sin(y), cos(x*y) + 1] [ cos(x)*tan(x), 2*sin(x)^2]
Use has
to check which elements of M
contain sin(x)
.
The result is a matrix of the same size as M
, with 1s
and 0s
as
its elements. For the elements of M
containing
the specified expression, has
returns logical 1s
.
For the elements that do not contain that subexpression, has
returns
logical 0s
.
T = has(M, sin(x))
T = 2×2 logical array 1 0 0 1
Return only the elements that contain sin(x)
and
replace all other elements with 0
by multiplying M
by T
elementwise.
M.*T
ans = [ sin(x)*sin(y), 0] [ 0, 2*sin(x)^2]
To check if any of matrix elements contain a particular subexpression,
use any
.
any(has(M(:), sin(x)))
ans = logical 1
any(has(M(:), cos(y)))
ans = logical 0
Using has
, find those
elements of a symbolic vector that contain any of the specified subexpressions.
syms x y z T = has([x + 1, cos(y) + 1, y + z, 2*x*cos(y)], [x, cos(y)])
T = 1×4 logical array 1 1 0 1
Return only the elements of the original vector that contain x
or cos(y)
or
both, and replace all other elements with 0
by
multiplying the original vector by T
elementwise.
[x + 1, cos(y) + 1, y + z, 2*x*cos(y)].*T
ans = [ x + 1, cos(y) + 1, 0, 2*x*cos(y)]
has
for Symbolic FunctionsIf expr
or subexpr
is
a symbolic function, has
uses formula(expr)
or formula(subexpr)
.
This approach lets the has
function check if
an expression defining the symbolic function expr
contains
an expression defining the symbolic function subexpr
.
Create a symbolic function.
syms x f(x) = sin(x) + cos(x);
Here, sin(x) + cos(x)
is an expression defining
the symbolic function f
.
formula(f)
ans = cos(x) + sin(x)
Check if f
and f(x)
contain sin(x)
.
In both cases has
checks if the expression sin(x)
+ cos(x)
contains sin(x)
.
has(f, sin(x)) has(f(x), sin(x))
ans = logical 1 ans = logical 1
Check if f(x^2)
contains f
.
For these arguments, has
returns logical 0
(false)
because it does not check if the expression f(x^2)
contains
the letter f
. This call is equivalent to has(f(x^2),
formula(f))
, which, in turn, resolves to has(cos(x^2)
+ sin(x^2), cos(x) + sin(x))
.
has(f(x^2), f)
ans = logical 0
Check for calls to a particular function by specifying the function name as the second argument. Check for calls to any one of multiple functions by specifying the multiple functions as a cell array of character vectors.
Integrate tan(x^7)
. Determine if the integration
is successful by checking the result for calls to int
.
Because has
finds the int
function
and returns logical 1
(true
),
the integration is not successful.
syms x f = int(tan(x^7), x); has(f, 'int')
ans = logical 1
Check if the solution to a differential equation contains calls
to either sin
or cos
by specifying
the second argument as {'sin','cos'}
. The has
function
returns logical 0
(false
), which
means the solution does not contain calls to either sin
or cos
.
syms y(x) a sol = dsolve(diff(y,x) == a*y); has(sol, {'sin' 'cos'})
ans = logical 0
has
does not transform or simplify
expressions. This is why it does not find subexpressions like x^2
in
expressions like (x + 1)^2
. However, in some cases has
might
find that an expression or subexpression can be represented in a form
other than its original form. For example, has
finds
that the expression -x - 1
can be represented as -(x
+ 1)
. Thus, the call has(-x - 1, x + 1)
returns 1
.
If expr
is an empty symbolic array, has
returns
an empty logical array of the same size as expr
.