Вопрос

Предположим, у меня есть список матриц, сохраненных в переменной 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top