has
式に特定の部分式が含まれるかどうかのチェック
説明
has(
は、expr
,subexpr
)expr
が subexpr
を含む場合は logical 1
(true) を返します。そうでない場合、logical 0
(false) を返します。
expr
が配列の場合、has(expr,subexpr)
はexpr
と同じサイズの配列を返します。返される配列には、expr
の要素にsubexpr
が含まれる場合に logical1s
(true) が含まれ、そうでない場合は logical0s
(false) が含まれます。subexpr
が配列の場合は、has(expr,subexpr)
がexpr
にsubexpr
の要素が含まれるかどうかをチェックします。
例
式に特定の部分式が含まれるかどうかのチェック
関数 has
を使用して、式に特定の変数または部分式が含まれるかどうかをチェックします。
次の式に変数 z
が含まれるかどうかをチェックします。
syms x y z has(x + y + z, z)
ans = logical 1
has(x + y, z)
ans = logical 0
x + y + z
に次の部分式が含まれるかどうかをチェックします。has
は、項 x
と項 z
が式内で隣り合わせていない場合でも、部分式 x + z
を検出することに注目してください。
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
式 (x + 1)^2
に x^2
が含まれるかどうかをチェックします。(x + 1)^2
は式 x^2 + 2*x + 1
に数学的に等価ですが、has
では一般的に部分式のテスト時に式を別の形式に変換しないため、結果は logical 0
になります。
has((x + 1)^2, x^2)
ans = logical 0
式を展開してから has
を呼び出し、結果に x^2
が含まれるかどうかをチェックします。expand((x + 1)^2)
によって元の式が x^2 + 2*x + 1
に変換されるため、関数 has
で部分式 x^2
が検出され、logical 1
が返されます。
has(expand((x + 1)^2), x^2)
ans = logical 1
式に指定した部分式のいずれかが含まれるかどうかのチェック
シンボリック式にベクトルの要素として指定された部分式のいずれかが含まれるかどうかをチェックします。
指定した部分式が式に 1 つ以上含まれる場合、has
は logical 1
を返します。
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), sin(x), exp(x)])
ans = logical 1
指定した部分式が式に 1 つも含まれない場合、has
は logical 0
を返します。
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), exp(x)])
ans = logical 0
特定の部分式を含む行列要素の検出
has
を使用して、特定の部分式を含むシンボリック行列の要素を検出します。
まず、行列を作成します。
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]
has
を使用し、sin(x)
を含む M
の要素をチェックします。結果は、1s
と 0s
が要素として含まれる M
と同じサイズの行列になります。M
の要素に特定の式が含まれる場合、has
は logical 1s
を返します。要素にその部分式が含まれない場合、has
は logical 0s
を返します。
T = has(M, sin(x))
T = 2×2 logical array 1 0 0 1
M
に T
を要素ごとに乗算して、sin(x)
を含む要素のみを返し、他のすべての要素を 0
で置き換えます。
M.*T
ans = [ sin(x)*sin(y), 0] [ 0, 2*sin(x)^2]
特定の部分式を含む行列要素があるかどうかをチェックするには、any
を使用します。
any(has(M(:), sin(x)))
ans = logical 1
any(has(M(:), cos(y)))
ans = logical 0
指定した部分式のいずれかを含むベクトル要素の検出
has
を使用して、指定した部分式のいずれかを含むシンボリック ベクトルの要素を検出します。
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
元のベクトルに T
を要素ごとに乗算して、x
または cos(y)
あるいはその両方を含む元のベクトルの要素のみを返し、他のすべての要素を 0
で置き換えます。
[x + 1, cos(y) + 1, y + z, 2*x*cos(y)].*T
ans = [ x + 1, cos(y) + 1, 0, 2*x*cos(y)]
シンボリック関数に対する has
の使用
expr
または subexpr
がシンボリック関数の場合、has
では formula(expr)
または formula(subexpr)
を使用します。この方法では、関数 has
を使用して、シンボリック関数 expr
を定義する式にシンボリック関数 subexpr
を定義する式が含まれるかどうかをチェックします。
シンボリック関数を作成します。
syms x f(x) = sin(x) + cos(x);
ここで、sin(x) + cos(x)
はシンボリック関数 f
を定義する式です。
formula(f)
ans = cos(x) + sin(x)
f
と f(x)
に sin(x)
が含まれるかどうかをチェックします。どちらの場合も、has
は sin(x) + cos(x)
に sin(x)
が含まれるかどうかをチェックします。
has(f, sin(x)) has(f(x), sin(x))
ans = logical 1 ans = logical 1
f(x^2)
に f
が含まれるかどうかをチェックします。これらの引数の場合、has
は式 f(x^2)
に文字 f
含まれるかどうかをチェックするわけではないため、logical 0
(false) が返されます。この呼び出しは has(f(x^2), formula(f))
と等価です。これは has(cos(x^2) + sin(x^2), cos(x) + sin(x))
に解決されます。
has(f(x^2), f)
ans = logical 0
特定の関数に対する呼び出しのチェック
関数名を 2 番目の引数として指定して、特定の関数の呼び出しがあるかをチェックします。複数の関数を文字ベクトルの cell 配列として指定し、複数の関数のいずれかの呼び出しがあるかをチェックします。
tan(x^7)
を積分します。int
の呼び出しの結果をチェックして、積分が正常に終了したかどうかを判定します。has
は関数 int
を検出し、logical 1
(true
) を返しているため、積分は正常に終了していません。
syms x f = int(tan(x^7), x); has(f, 'int')
ans = logical 1
2 番目の引数を {'sin','cos'}
と指定して、微分方程式の解に sin
または cos
の呼び出しが含まれているかどうかをチェックします。関数 has
は logical 0
(false
) を返しています。これは、sin
または cos
の呼び出しが解に含まれていないことを意味します。
syms y(x) a sol = dsolve(diff(y,x) == a*y); has(sol, {'sin' 'cos'})
ans = logical 0
入力引数
ヒント
has
は式の変換も単純化もしません。このため、(x + 1)^2
のような式でx^2
のような部分式は検出されません。しかし、場合によっては、has
が、式や部分式が元の形式とは異なる形式で表現され得ることを検出する場合があります。たとえば、has
では、式-x - 1
が-(x + 1)
として表現され得ることを検出します。そのため、呼び出しhas(-x - 1, x + 1)
は1
を返します。expr
が空のシンボリック配列の場合、has
はexpr
と同じサイズの空の logical 配列を返します。
バージョン履歴
R2015b で導入