Поддерживает ли Mathematica 7 ленивую оценку? - PullRequest
8 голосов
/ 10 февраля 2010

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

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

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

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

3 голосов
/ 10 февраля 2010

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

1 голос
/ 11 февраля 2010

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

top/@G 

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

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

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

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

...