2010-02-09 10 views
8

suppose que j'ai une liste de matrices enregistré dans la variable G et appliquer les opérations suivantes:Mathematica 7 prend-il en charge l'évaluation paresseuse?

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

Minors renvoie une matrice où chaque élément est le facteur déterminant de la rangée/colonne (i, j) supprimée, et Diagonal renvoie la liste des éléments diagonaux d'une matrice.

Ma question porte sur l'évaluation de ces commandes - clairement, je ne veux pas que toutes les entrées soient évaluées. Est-ce que Mathematica est paresseux dans le sens où Diagonal est analysé en premier ce qui ne fait qu'extraire les éléments nécessaires aux Mineurs ou est-ce que la matrice mineure est construite et ensuite ses éléments diagonaux sont extraits?

Ceci est une question générale pour l'évaluation paresseuse, mais étant nouveau pour Mathematica, j'apprécierais des conseils sur la façon d'améliorer la syntaxe pour le problème spécifique.

+0

G est une matrice ou une liste de matrices? Voulez-vous dire à Map top over G? puis prenez la Diagonale d'une liste de matrices? – Davorak

Répondre

3

Il est tard donc seulement une réponse courte: enquêter Hold[] et ses proches. Avec eux, vous pouvez mettre en œuvre des fonctions d'évaluation paresseuses. La plupart des fonctions de Mathematica intrinsèques ne sont pas paresseuses, quelques-unes le sont. En général, en tant que débutant, vous devez éviter de modifier le comportement des fonctions intrinsèques de Mathematica, bien qu'il soit très amusant de le faire et peut très facilement rendre le système entier inutilisable.

+1

Lorsque vous en aurez l'occasion, pourriez-vous éditer votre question pour fournir un exemple (peut-être celui-ci comme indiqué)? Le site Web de Mathematica, bien que rempli d'exemples, ne semblait pas faire quelque chose de pratique. – Hooked

1

Aucune mathématique n'est pas paresseuse en général.

top/@G 

Produira une matrice sur laquelle fonctionnera Diagonal. Puisque les mineurs ne fonctionnent pas sur des éléments individuels de la matrice, ce que vous demandez n'est pas, à ma connaissance, juste une évaluation paresseuse non plus.

Je pense que j'ai une solution pour vous. Cette solution ne produira que les Mineurs des éléments Diagonaux à additionner en Diagonale. Mais j'ai seulement déplacé le calcul en excès à un problème d'utilisation excessive de la mémoire. Puisque la sous-matrice des éléments hors diagonale est toujours produite seulement pour être jetée. Je posterai encore si je pense à un moyen d'empêcher cela aussi bien.

3

Vous pouvez résoudre ce problème en construisant la liste des mineurs en diagonale par vous-même, puis en appliquant Det, pour une matrice M:

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

Ceci est un peu cludge mais il est environ 50 fois plus rapide que d'utiliser Mathematica Minors intégré et de ne sélectionner que les éléments diagonaux (testés sur des matrices aléatoires de 100x100).

+0

(+1) Pour la solution pratique au problème particulier (merci!). Je choisis une réponse différente puisque la question portait sur l'évaluation paresseuse dans Mathematica. – Hooked

+0

Pas de problème :-). – Timo