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