Предположим, что у меня есть список Матриц, сохраненных в переменной G
и примените следующие операции:
top[g_] = Minors[g]
Diagonal[top /@ G]
Minors
возвращает матрицу, где каждый элемент является детерминантом с (я, j) строка/седло, удаленная, и Diagonal
возвращает список диагональных элементов матрицы.
Мой вопрос находится на оценке этих команд - ясно я не хочу все оцененные записи. Действительно ли Mathematica ленив в том смысле, что Диагональ анализируется сначала, который только извлекает элементы, необходимые от Несовершеннолетних, или незначительная матрица создается, и затем ее диагональные элементы вытащены?
Это - общий вопрос для отложенных вычислений, однако будучи в новинку для Mathematica, я ценил бы любые подсказки относительно того, как улучшить синтаксис для определенной проблемы.
Уже поздно, поэтому только краткий ответ: изучите Hold[]
и его родственников. С их помощью вы можете реализовать ленивые вычисляющие функции. Большинство встроенных функций системы Mathematica не являются ленивыми, некоторые - являются. В целом, как новичку, вам следует избегать изменения поведения внутренних функций системы Mathematica, хотя это очень весело и может легко сделать всю систему непригодной для использования.
Я предлагаю два метода: объекты функций и указатели функций. В любом случае включите класс для получения объекта Function Object или указателя Function на генератор случайных чисел.
С помощью объекта Function можно определить базовый класс и реализовать функции принимающего класса, которые требуют указателя на класс объекта базовой функции. Это дает больше свободы в определении множества различных объектов функций без изменения интерфейса класса-получателя.
-121--1681404-Выражения в скобках называются обозначениями , и это синтаксис для инициализации массива или структуры путем именования полей или элементов, а не просто путем упорядочения инициализаторов в той же последовательности, что и объявление.
-121--2076309-Никакая математика вообще не ленива.
top/@G
Создаст матрицу, над которой будет работать Diagonal. Поскольку Несовершеннолетние не оперируют отдельными элементами матрицы, то, о чем вы просите, это тоже не просто ленивая оценка.
Я думаю, что у меня есть решение для вас.
Clear[f];
Diagonal[Minors[G,Length[G],f]]/.f->Det
Это решение создаст только Миноры Диагональных элементов, которые будут суммированы Диагональю. Но я только перенес избыточные вычисления на проблему избыточного использования памяти. Поскольку подматрица смещенных диагональных элементов все еще производится только для того, чтобы быть выброшенной. Я снова опубликую, если подумаю о пути, чтобы предотвратить это.
Вы можете решить эту проблему, построив список диагональных минимумов самостоятельно и затем применив Det
, для матрицы M
:
Map[Det,Drop[Transpose[Drop[M,{#}]],{#}]& /@ Range[1,Dimensions[M][[1]]]]
Это немного хлопотно, но примерно в 50 раз быстрее, чем использовать встроенный в Mathematica Minors
и отбирать только диагональные элементы (проверено на случайных матрицах 100x100).