Как именно работает функция оценки в Wolfram Mathematica. Как это влияет на два графика ниже

Я пытаюсь понять, как именно работает функция Evaluate. Здесь у меня есть два примера, и единственная разница между ними заключается в функции Evaluate.

Первый сюжет с Evaluate.

ReliefPlot[
 Table[Evaluate[Sum[Sin[RandomReal[9, 2].{x, y}], {20}]], {x, 1, 2, .02}, 
                                                          {y, 1, 2, .02}], 
ColorFunction -> 
(Blend[{Darker[Green, .8], Lighter[Brown, .2],White}, #] &), 
  Frame -> False, Background -> None, PlotLegends -> Automatic]

https://imgur.com/itBRYEv.png "участок 1"

Второй сюжет без оценки.

ReliefPlot[
 Table[Sum[Sin[RandomReal[9, 2].{x, y}], {20}], {x, 1, 2, .02}, 
                                                {y, 1,2, .02}], 
ColorFunction -> 
(Blend[{Darker[Green, .8], Lighter[Brown, .2], White}, #] &),
 Frame -> False, Background -> None, 
 PlotLegends -> Automatic]

https://i.imgur.com/fvdiSCm.png "участок 2"

Пожалуйста, объясните, какое значение здесь имеет Evaluation.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
437
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Table имеет атрибут HoldAll

Attributes[Table]
(* {HoldAll, Protected} *)

Прочтите это и это, чтобы узнать больше об оценке в WL.

Я до сих пор не понимаю, как это меняет результат. Например, Table[Evaluate[Sin[k * j]], {k, 1, 4}, {j, 1, 4}] // MatrixForm и Table[Sin[k * j], {k, 1, 4} , {j, 1, 4}] // MatrixForm дает тот же результат.

EnesZ 31.03.2019 22:28
Ответ принят как подходящий

Сравните это

count=0;
ReliefPlot[Table[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}],{x,1,2,.02},{y,1,2,.02}]]
count

который должен отображать ваш график, за которым следует 52020 = 51 * 51 * 20, потому что у вас есть таблица 51 * 51, и каждая запись должна оценивать 20 итераций вашей суммы.

с этим

count=0;
ReliefPlot[Table[Evaluate[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}]],{x,1,2,.02},{y,1,2,.02}]]
count

который должен отображать ваш график, за которым следует 20, потому что Evaluate нужно было выполнить 20 итераций вашей суммы только один раз, даже если вы видите на экране 51 * 51 блоков разных цветов.

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

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

То, что вы ставите и видите на экране, является интерфейсом Mathematica. За этим скрывается серверная часть, где выполняется большая часть фактических вычислений. Передняя и задняя части взаимодействуют друг с другом во время ввода, вычислений, вывода и отображения.

Но это все еще не отвечает на вопрос, почему два сюжета выглядят так по-разному. Я предполагаю, что когда вы не используете Evaluate и, таким образом, не отмечаете результат таблицы как завершенный и законченный, тогда ReliefPlot будет неоднократно проверять это выражение в вашей таблице, и это выражение будет каждый раз другим из-за RandomReal и это то, что отображает более плавную отображаемую графику с более высоким разрешением. Но когда вы используете Evaluate и, таким образом, таблица помечается как завершенная и не требует дальнейшей оценки, тогда ReliefPlot просто использует значения 51 * 51 без пересчета или проверки, и вы получаете ReliefPlot с более низким разрешением.

Как и почти во всей системе Mathematica, детали алгоритмов, используемых для каждой из тысяч различных функций, недоступны. Иногда вкладка «Параметры и сведения» на странице справки для данной функции может предоставить вам дополнительную информацию. Иногда экспериментирование может помочь вам угадать, что скрывается за кодом. Иногда другие очень умные люди выясняли части поведения и публиковали описания. Но это, наверное, все, что есть.

Другие вопросы по теме