hold
Задержите оценку
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
hold(object
)
hold(object)
предотвращает оценку object
.
Когда объект MuPAD® вводится в интерактивном режиме, затем система оценивает его и возвращает оцененный результат. Когда объект MuPAD передается в качестве аргумента процедуре, затем процедура обычно оценивает аргумент прежде, чем обработать его. Оценка означает, что идентификаторы заменяются их значениями, и вызовы функции выполняются. hold
предназначается, чтобы предотвратить такую оценку, когда это - нежелательный.
Типовое приложение hold
когда функция, которая может только обработать числовые аргументы, но не символические единицы, должна использоваться в качестве выражения. Смотрите Пример 6.
Другая возможная причина для использования hold
КПД. Например, если вызов функции f(x, y)
с символьными аргументами передается в качестве аргумента другой функции, но, как известно, возвращает себя символически, затем возможно дорогостоящей оценки “внутреннего” вызова функции можно избежать путем передачи выражения hold(f) (x, y)
в качестве аргумента к “внешней” функции вместо этого. Затем аргументы x, y
оценены, но вызов f
не выполняется. Смотрите Пример в качестве примера 1 и Пример 7.
Начиная с использования hold
может привести к странным эффектам, рекомендуется использовать его только при необходимости.
hold
только задерживает оценку объекта, но не может полностью предотвратить его на длительном периоде; смотрите Пример 5.
Можно использовать freeze
полностью предотвратить оценку процедуры или функциональной среды.
Процедура MuPAD может быть объявлена с опцией, содержат. Это оказывает влияние, что аргументы передаются процедуре unevaluatedly. Смотрите страницу справки proc
для деталей.
Функции eval
или level
может использоваться, чтобы обеспечить последующую оценку неоцененного объекта (см. Пример в качестве примера 2). В процедурах с option hold
, используйте context
вместо этого.
В следующем двум примерам оценка выражения MuPAD предотвращена с помощью hold
:
x := 2: hold(3*0 - 1 + 2^2 + x)
hold(error("not really an error"))
Без hold
, результаты были бы следующие:
x := 2: 3*0 - 1 + 2^2 + x
error("not really an error")
Error: not really an error
Следующая команда предотвращает оценку операции _plus
, но не оценка операндов:
hold(_plus)(3*0, -1, 2^2, x)
Обратите внимание на то, что в предыдущем примере, аргументы вызова функции оценены, потому что hold
применяется только к функциональному _plus
. В следующем примере аргумент вызова функции оценен, несмотря на тот факт что f
имеет опцию, содержите:
f := proc(a) option hold; begin return(a + 1) end_proc: x := 2: hold(f)(x)
Это происходит по следующей причине. Когда f
оценен, опция hold
предотвращает оценку аргумента x
'off'
(см. следующий пример). Однако, если оценка f
предотвращен hold
, затем опция hold
не оказывает влияния, и MuPAD оценивает операнды, но не вызов функции.
Следующий пример показывает ожидаемое поведение:
f(x), hold(f(x))
Функциональный eval
отменяет эффект hold
. Обратите внимание на то, что это дает к очень отличающимся результатам, в зависимости от того, как это применяется:
eval(f(x)), eval(hold(f)(x)), eval(hold(f(x))), eval(hold(f))(x)
Несколько hold
вызовы могут быть вложены, чтобы предотвратить последующие оценки:
x := 2: hold(x), hold(hold(x))
Результат hold ( hold(x) )
неоцененный операнд внешнего вызова hold
, то есть, hold(x)
. Применение eval
оценивает результат hold(x)
и дает к неоцененному идентификатору x
:
eval(%)
Другое приложение eval
дает к значению x
:
eval(%)
delete x, f:
Следующая команда предотвращает оценку операции _plus
, замены это операцией _mult
, и затем оценивает результат:
eval(subsop(hold(_plus)(2, 3), 0 = _mult))
Функциональный domtype
оценивает его аргументы:
x := 0: domtype(x), domtype(sin), domtype(x + 2)
Используя hold
, доменный тип неоцененных объектов может быть определен: x
и sin
идентификаторы и x + 2
выражение:
domtype(hold(x)), domtype(hold(sin)), domtype(hold(x + 2))
hold
предотвращает только одну оценку объекта, но она не предотвращает оценку в более позднее время. Таким образом использование hold
чтобы получить, символ без значения обычно является не хорошей идеей:
x := 2: y := hold(x); y
В этом примере, удаляя значение идентификатора x
делает его символом и использованием hold
не необходимо:
delete x: y := x; y
Однако лучший способ получить новый символ без значения состоит в том, чтобы использовать genident
:
y := genident("z"); y
delete y:
Рассмотрите кусочный заданный функциональный f (x), который является тождественно нулевым на отрицательной вещественной оси и равным на положительной вещественной оси:
f := x -> if x < 0 then 0 else exp(-x) end_if:
Эта функция не может быть вызвана с символьным аргументом, потому что условие x <0 не может быть решено:
f(x)
Error: Unable to evaluate to Boolean. [_less] Evaluating: f
Мы хотим интегрировать f
численно. Однако числовой интегратор ожидает функцию как выражение:
numeric::int(f(x), x = -2..2)
Error: Unable to evaluate to Boolean. [_less] Evaluating: f
Решение состоит в том, чтобы подавить преждевременную оценку f
при передаче функции с символьным аргументом. В числовом интеграторе численными значениями заменяют x, прежде чем функция будет вызвана и оценена:
numeric::int(hold(f)(x), x = -2..2)
Функциональный int
не может вычислить закрытую форму следующего интеграла и возвращает символьный int
вызов:
int(sqrt(x)*sqrt(sqrt(x) + 1), x)
После изменения variablessqrt(x)=t
, может быть вычислена закрытая форма:
t := time(): f := intlib::changevar(int(sqrt(x)*sqrt(sqrt(x) + 1), x), sqrt(x) = y); time() - t; eval(f)
Измерение вычислительных времен с time
показывает: Наиболее часто в вызове intlib::changevar
потрачен в переоценке аргумента. Это может быть предотвращено при помощи hold
:
t := time(): f := intlib::changevar(hold(int)(sqrt(x)*sqrt(sqrt(x) + 1), x), sqrt(x) = y); time() - t;
|
Любой объект MuPAD |
Объект Unevaluated.