Unterstützt Mathematica 7 Lazy Evaluation?

8

Angenommen, ich habe eine Liste von Matrizen, die in der Variablen G gespeichert sind, und wende folgende Operationen an:

%Vor%

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

Meine Frage betrifft die Auswertung dieser Befehle - klar will ich nicht, dass alle Einträge ausgewertet werden. 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 verbessern kann.

    
Hooked 09.02.2010, 22:52
quelle

3 Antworten

3

Es ist spät, also nur eine kurze Antwort: untersuchen Sie Hold[] und seine 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 solltest du es als Anfänger vermeiden, das Verhalten der intrinsischen Funktionen von Mathematica zu ändern, obwohl es sehr viel Spaß macht und sehr leicht das ganze System unbrauchbar machen kann.

    
High Performance Mark 09.02.2010, 22:59
quelle
3
___ answer2233162 ___

Es ist spät, also nur eine kurze Antwort: untersuchen Sie Det und seine 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 solltest du es als Anfänger vermeiden, das Verhalten der intrinsischen Funktionen von Mathematica zu ändern, obwohl es sehr viel Spaß macht und sehr leicht das ganze System unbrauchbar machen kann.

    
___ tag123wolframmathematica ___ Wolfram Mathematica ist ein Computeralgebrasystem und eine Programmiersprache von Wolfram Research. Mathematica hat eine eigene Stack Exchange-Site unter http://mathematica.stackexchange.com/. ___ answer2241459 ___

Kein Mathematiker ist generell nicht faul.

%Vor%

Erstellt eine Matrix, auf der Diagonal arbeiten wird. Da Minors nicht auf einzelnen Elementen der Matrix operiert, ist das, wonach du fragst, meines Wissens nicht nur eine faule Bewertung.

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

%Vor%

Diese Lösung erzeugt nur die Minors der diagonalen Elemente, die von Diagonal summiert werden. Aber ich habe die überschüssige Berechnung nur in ein Problem mit überschüssigem Speicherverbrauch verschoben. Da die Submatrix von Off-Diagonal-Elementen immer noch erzeugt wird, wird sie nur weggeworfen. Ich werde wieder posten, wenn ich mir einen Weg vorstelle, das auch zu verhindern.

    
___ answer2240000 ___

Sie können dieses Problem lösen, indem Sie die Liste der diagonalen Minderjährigen selbst erstellen und dann M für eine Matrix Minors :

anwenden %Vor%

Dies ist ein bisschen ein Cludge, aber es ist etwa 50 mal schneller als mit Mathematica eingebaut in %code% und nur die diagonalen Elemente (getestet auf 100x100 zufällige Matrizen) abzugreifen.

    
___ tag123lazyevaluation ___ Lazy Evaluation bezieht sich auf eine Vielzahl von Konzepten, die eine Evaluierung vermeiden wollen eines Ausdrucks, außer wenn sein Wert benötigt wird, und um die Ergebnisse der Auswertung eines Ausdrucks unter allen Verwendungen seines Ausdrucks zu teilen, so dass kein Ausdruck benötigt wird mehr als einmal bewertet werden. ___ qstntxt ___

Angenommen, ich habe eine Liste von Matrizen, die in der Variablen %code% gespeichert sind, und wende folgende Operationen an:

%Vor%

%code% gibt eine Matrix zurück, in der jedes Element die Determinante mit der gelöschten (i, j) -Zeile / Spalte ist, und %code% gibt eine Liste der diagonalen Elemente einer Matrix zurück.

Meine Frage betrifft die Auswertung dieser Befehle - klar will ich nicht, dass alle Einträge ausgewertet werden. 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 verbessern kann.

    
___ qstnhdr ___ Unterstützt Mathematica 7 Lazy Evaluation? ___
Timo 11.02.2010 14:22
quelle
1

Kein Mathematiker ist generell nicht faul.

%Vor%

Erstellt eine Matrix, auf der Diagonal arbeiten wird. Da Minors nicht auf einzelnen Elementen der Matrix operiert, ist das, wonach du fragst, meines Wissens nicht nur eine faule Bewertung.

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

%Vor%

Diese Lösung erzeugt nur die Minors der diagonalen Elemente, die von Diagonal summiert werden. Aber ich habe die überschüssige Berechnung nur in ein Problem mit überschüssigem Speicherverbrauch verschoben. Da die Submatrix von Off-Diagonal-Elementen immer noch erzeugt wird, wird sie nur weggeworfen. Ich werde wieder posten, wenn ich mir einen Weg vorstelle, das auch zu verhindern.

    
Davorak 11.02.2010 00:39
quelle