Mathematica 7 поддерживает отложенные вычисления?

Предположим, что у меня есть список Матриц, сохраненных в переменной G и примените следующие операции:

top[g_] = Minors[g]
Diagonal[top /@ G] 

Minorsвозвращает матрицу, где каждый элемент является детерминантом с (я, j) строка/седло, удаленная, и Diagonal возвращает список диагональных элементов матрицы.

Мой вопрос находится на оценке этих команд - ясно я не хочу все оцененные записи. Действительно ли Mathematica ленив в том смысле, что Диагональ анализируется сначала, который только извлекает элементы, необходимые от Несовершеннолетних, или незначительная матрица создается, и затем ее диагональные элементы вытащены?

Это - общий вопрос для отложенных вычислений, однако будучи в новинку для Mathematica, я ценил бы любые подсказки относительно того, как улучшить синтаксис для определенной проблемы.

8
задан Cœur 7 March 2019 в 16:15
поделиться

3 ответа

Уже поздно, поэтому только краткий ответ: изучите Hold[] и его родственников. С их помощью вы можете реализовать ленивые вычисляющие функции. Большинство встроенных функций системы Mathematica не являются ленивыми, некоторые - являются. В целом, как новичку, вам следует избегать изменения поведения внутренних функций системы Mathematica, хотя это очень весело и может легко сделать всю систему непригодной для использования.

3
ответ дан 5 December 2019 в 21:19
поделиться

Я предлагаю два метода: объекты функций и указатели функций. В любом случае включите класс для получения объекта Function Object или указателя Function на генератор случайных чисел.

С помощью объекта Function можно определить базовый класс и реализовать функции принимающего класса, которые требуют указателя на класс объекта базовой функции. Это дает больше свободы в определении множества различных объектов функций без изменения интерфейса класса-получателя.

-121--1681404-

Обозначения в инициализации массива

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

-121--2076309-

Никакая математика вообще не ленива.

top/@G 

Создаст матрицу, над которой будет работать Diagonal. Поскольку Несовершеннолетние не оперируют отдельными элементами матрицы, то, о чем вы просите, это тоже не просто ленивая оценка.

Я думаю, что у меня есть решение для вас.

Clear[f];
Diagonal[Minors[G,Length[G],f]]/.f->Det

Это решение создаст только Миноры Диагональных элементов, которые будут суммированы Диагональю. Но я только перенес избыточные вычисления на проблему избыточного использования памяти. Поскольку подматрица смещенных диагональных элементов все еще производится только для того, чтобы быть выброшенной. Я снова опубликую, если подумаю о пути, чтобы предотвратить это.

1
ответ дан 5 December 2019 в 21:19
поделиться

Вы можете решить эту проблему, построив список диагональных минимумов самостоятельно и затем применив Det, для матрицы M:

Map[Det,Drop[Transpose[Drop[M,{#}]],{#}]& /@ Range[1,Dimensions[M][[1]]]]

Это немного хлопотно, но примерно в 50 раз быстрее, чем использовать встроенный в Mathematica Minors и отбирать только диагональные элементы (проверено на случайных матрицах 100x100).

3
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: