Question

Si j'ai une liste des enregistrées dans la matrices G variable et appliquer les opérations suivantes:

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

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

Ma question porte sur l'évaluation de ces commandes - bien que je ne veux pas toutes les entrées évaluées. Mathematica est paresseux dans le sens où Diagonal est analysé d'abord qui extrait uniquement les éléments nécessaires de mineurs ou est la matrice mineure construite et ses éléments en diagonale sont retirés?

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

Était-ce utile?

La solution

Il est tard si seulement une courte réponse: enquête sur Hold[] et ses parents. Avec eux, vous pouvez mettre en œuvre des fonctions d'évaluation paresseux. La plupart des fonctions intrinsèques Mathematica ne sont pas paresseux, quelques-unes sont. En général, en tant que débutant, vous devriez éviter de modifier le comportement des fonctions intrinsèques de Mathematica, mais il est très amusant de le faire et peut très facilement rendre l'ensemble du système inutilisable.

Autres conseils

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 l'utilisation Mathematica construit dans Minors et égrappage seulement les éléments en diagonale (testé sur 100x100 matrices aléatoires).

Non Mathematica est pas paresseux en général.

top/@G 

Cela produira une matrice diagonale fonctionnera sur. Étant donné que les mineurs ne fonctionne pas sur des éléments individuels de la matrice, ce que vous demandez est pas, de ma connaissance, juste évaluation paresseuse soit.

Je pense avoir une solution pour vous bien.

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

Cette solution ne produira que de se résumer par les mineurs Diagonale des éléments de la diagonale. Mais je n'ai déplacé le calcul en excès à un excès problème d'utilisation de la mémoire. Étant donné que la sous-matrice d'éléments diagonaux est encore produit ne doit être jeté. Je poste à nouveau si je pense à un moyen d'empêcher cela aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top