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 1M に 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 で導入