2010-02-09 19 views
8

glaube, ich habe eine Liste der Matrices in der Variablen G gespeichert und gelten die folgenden Operationen:Unterstützt Mathematica 7 Lazy Evaluation?

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

Minors liefert eine Matrix, in der jedes Element die Determinante mit dem (i, j) Zeile/Spalte gelöscht wird, und Diagonal gibt eine Liste der diagonalen Elemente einer Matrix zurück.

Meine Frage ist auf die Auswertung dieser Befehle - klar will ich nicht alle Einträge ausgewertet. Ist Mathematica faul in dem Sinne, dass zuerst Diagonal geparst wird, das nur die Elemente extrahiert, die von Minors benötigt werden, oder wird die Nebenmatrix konstruiert und dann werden ihre diagonalen Elemente herausgezogen?

Dies ist eine allgemeine Frage für eine faule Bewertung, aber für Mathematica neu zu sein, würde ich mich über alle Tipps freuen, wie man die Syntax für das spezifische Problem verbessert.

+0

G ist eine Matrix oder eine Liste von Matrizen? Willst du Top über G mappen? und dann nehmen Sie die Diagonale einer Liste von Matrizen? – Davorak

Antwort

3

Es ist spät, also nur eine kurze Antwort: untersuchen Hold[] und ihre Verwandten. Mit ihnen können Sie faul auswertende Funktionen implementieren. Die meisten intrinsischen Mathematica-Funktionen sind nicht faul, ein paar sind es auch. Im Allgemeinen sollten Sie als Anfänger das Verhalten der intrinsischen Funktionen von Mathematica nicht verändern, obwohl es sehr viel Spaß macht und sehr leicht das gesamte System unbrauchbar machen kann.

+1

Wenn Sie die Chance bekommen, könnten Sie Ihre Frage bearbeiten, um ein Beispiel zu geben (vielleicht das bestimmte wie angegeben) ?. Die Mathematica-Website schien, obwohl sie mit Beispielen gefüllt war, nichts Praktisches zu tun. – Hooked

1

Kein Mathematiker ist im Allgemeinen nicht faul.

top/@G 

Erzeugt eine Matrix, auf der Diagonal arbeiten wird. Da Minors nicht auf einzelnen Elementen der Matrix operiert, ist das, wonach Sie fragen, meines Wissens nach auch keine faule Bewertung.

Ich denke, ich habe eine Lösung für Sie.

Diese Lösung erzeugt nur die Minor der Diagonalelemente, die von Diagonal summiert werden. Aber ich habe nur die überschüssige Berechnung auf ein überschüssiges Speicherbelegungsproblem verschoben. Da die Submatrix von Off-Diagonal-Elementen immer noch erzeugt wird, wird sie nur weggeworfen. Ich werde wieder posten, wenn ich an einen Weg denke, das auch zu verhindern.

3

Sie können dieses Problem lösen, indem die Liste der Diagonale der Kinder und Jugendlichen selbst aufbauen und dann Det, für eine Matrix Anwendung M:

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

Dies ist ein bisschen wie ein cludge aber es ist etwa 50-mal schneller als mit Mathematica eingebaut Minors und nur die diagonalen Elemente (getestet auf 100x100 zufällige Matrizen) abzugreifen.

+0

(+1) Für die praktische Lösung des jeweiligen Problems (Danke!). Ich wähle eine andere Antwort, da es sich bei der Frage um eine faule Bewertung in Mathematica handelte. – Hooked

+0

Kein Problem :-). – Timo