has

Проверяйте, содержит ли выражение конкретную подэкспрессию

Синтаксис

Описание

пример

has(expr,subexpr) возвращает логический 1 (true), если expr содержит subexpr. В противном случае возвращается логический 0 (false).

  • Если expr является массивом, has(expr,subexpr) возвращает массив того же размера, что и expr. Возвращенный массив содержит логические 1s (true) где элементы expr содержат subexpr, и логические 0s (ложь) там, где они этого не делают.

  • Если 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, результатом является логическое 0 потому что has обычно не преобразует выражения в различные формы при проверке на наличие подэкспрессий.

has((x + 1)^2, x^2)
ans =
  logical
   0

Разверните выражение и вызовите has проверить, содержит ли результат x^2. Потому что expand((x + 1)^2) преобразует исходное выражение в x^2 + 2*x + 1, has функция находит подэкспрессию x^2 и возвращает логический 1.

has(expand((x + 1)^2), x^2)
ans =
  logical
   1

Проверяйте, содержит ли выражение какие-либо заданные подэкспрессии

Проверьте, содержит ли символьное выражение какие-либо подэкспрессии, заданные в качестве элементов массива вектора.

Если выражение содержит одно или несколько заданных подэкспрессий, has возвращает логический 1.

syms x
has(sin(x) + cos(x) + x^2, [tan(x), cot(x), sin(x), exp(x)])
ans =
  logical
   1

Если выражение не содержит никаких заданных подэкспрессий, has возвращает логический 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 проверить, какие элементы M содержат sin(x). Результатом является матрица того же размера, что и M, с 1s и 0s как его элементы. Для элементов M содержащее указанное выражение, has возвращает логический 1s. Для элементов, которые не содержат этого подэкспрессии, has возвращает логический 0s.

T = has(M, sin(x))
T =
  2×2 logical array
     1     0
     0     1

Возвращает только элементы, которые содержат sin(x) и заменить все другие элементы на 0 путем умножения M по T элементарно.

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

Возвращает только элементы исходного вектора, которые содержат x или cos(y) или обоих, и заменить все другие элементы на 0 умножением исходного вектора на T элементарно.

[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 возвращает логический 0 (false), поскольку он не проверяет, является ли выражение f(x^2) содержит букву f. Этот вызов эквивалентен 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

Проверяйте на вызовы конкретной функции

Проверьте наличие вызовов конкретной функции путем определения имени функции в качестве второго аргумента. Проверяйте на вызовы любой из нескольких функций путем определения нескольких функций как массива ячеек из векторов символов.

Интеграция tan(x^7). Определите, является ли интегрирование успешной, путем проверки результата на вызовы к int. Поскольку has находит int function и возвращает логический 1 (true), интегрирование не является успешной.

syms x
f = int(tan(x^7), x);
has(f, 'int')
ans =
  logical
   1

Проверьте, содержит ли решение дифференциального уравнения вызовы к любому из sin или cos путем определения второго аргумента следующим {'sin','cos'}. has функция возвращает логический 0 (false), что означает, что решение не содержит вызовов ни на sin или cos.

syms y(x) a
sol = dsolve(diff(y,x) == a*y);
has(sol, {'sin' 'cos'})
ans =
  logical
   0

Входные параметры

свернуть все

Выражение для проверки, заданное как символьное выражение, функция, уравнение или неравенство. Также это может быть вектор, матрица или массив символьных выражений, функций, уравнений и неравенств.

Подэкспрессия для проверки, заданная как символьная переменная, выражение, функция, уравнение или неравенство, или вектор символов, или массив ячеек из векторов символов. subexpr может также быть вектором, матрицей или массивом символьных переменных, выражений, функций, уравнений и неравенств.

Совет

  • has не преобразует и не упрощает выражения. Вот почему он не находит такие подэкспрессии, как x^2 в выражениях, таких как (x + 1)^2. Однако в некоторых случаях has может оказаться, что выражение или подэкспрессия могут быть представлены в форме, отличной от его исходной формы. Для примера, has находит, что выражение -x - 1 может быть представлена как -(x + 1). Таким образом, вызов has(-x - 1, x + 1) возвращает 1.

  • Если expr - пустой символьный массив, has возвращает пустой логический массив того же размера, что и expr.

См. также

| |

Введенный в R2015b