Mathematica: rekonstruiere eine beliebige verschachtelte Liste nach Flatten

8

Was ist der einfachste Weg, um eine beliebig funky verschachtelte Liste expr einer Funktion unflatten so zuzuordnen, dass expr==unflatten@@Flatten@expr ?

Motivation: Compile kann nur vollständige Arrays behandeln (etwas, das ich gerade gelernt habe - aber nicht von der Fehlermeldung), also ist es die Idee, unflatten zusammen mit einer kompilierten Version des abgeflachten Ausdrucks zu verwenden:

%Vor%

Beispiel einer Lösung für ein weniger allgemeines Problem: Was ich tatsächlich tun muss, ist, alle Ableitungen für eine gegebene multivariate Funktion bis zu einer bestimmten Reihenfolge zu berechnen. Für diesen Fall hack 'ich mich so ein:

%Vor%

Das funktioniert, aber es ist weder elegant noch allgemein.

Bearbeiten: Hier ist die "job security" Version der von aaz bereitgestellten Lösung:

%Vor%

Es funktioniert ein Charme:

%Vor%     
Janus 15.02.2011, 05:34
quelle

3 Antworten

6
___ answer5000730 ___

Ich bin mir nicht sicher, was Sie mit Compile zu tun versuchen. Es wird verwendet, wenn Sie prozedurale oder funktionale Ausdrücke sehr schnell auf numerischen Werten auswerten wollen, also glaube ich nicht, dass es hier hilft. Wenn wiederholte Berechnungen von D [f, ...] Ihre Leistung behindern, können Sie sie mit etwas vorberechnen und speichern Flatten[{a,{b,c}}]==Flatten[{{a,b},c}]

Rufen Sie dann einfach d [k] an, um die k-te Ableitung zu erhalten.

    
___ qstntxt ___

Was ist der einfachste Weg, um eine beliebig funky verschachtelte Liste ArrayQ[expr] einer Funktion Dimensions[expr] so zuzuordnen, dass Partition ?

Motivation: Partition kann nur vollständige Arrays behandeln (etwas, das ich gerade gelernt habe - aber nicht von der Fehlermeldung), also ist es die Idee, unflatten zusammen mit einer kompilierten Version des abgeflachten Ausdrucks zu verwenden:

%Vor%

Beispiel einer Lösung für ein weniger allgemeines Problem: Was ich tatsächlich tun muss, ist, alle Ableitungen für eine gegebene multivariate Funktion bis zu einer bestimmten Reihenfolge zu berechnen. Für diesen Fall hack 'ich mich so ein:

%Vor%

Das funktioniert, aber es ist weder elegant noch allgemein.

Bearbeiten: Hier ist die "job security" Version der von aaz bereitgestellten Lösung:

%Vor%

Es funktioniert ein Charme:

%Vor%     
___ answer18284407 ___

Ich wollte nur die exzellenten Lösungen von aaz und Janus aktualisieren. Es scheint, dass, zumindest in Mathematica 9.0.1.0 auf Mac OSX, die Zuordnung (siehe aaz's Lösung)

%Vor%

schlägt fehl. Wenn wir jedoch

verwenden %Vor%

stattdessen gelingt es uns. Dasselbe gilt natürlich für den expr -Aufruf in Janus 'Job-Sicherheitsversion.

Für ein gutes Maß schließe ich meine eigene Funktion ein.

%Vor%

Es mag ein bisschen wie ein Cheat erscheinen, den ursprünglichen Ausdruck in der Funktion zu verwenden, aber wie aaz zeigt, brauchen wir einige Informationen aus dem ursprünglichen Ausdruck. Während Sie es nicht alle benötigen, um eine einzelne Funktion zu haben, die %code% haben kann, ist alles notwendig.

Meine Bewerbung ist der von Janus ähnlich: Parallele Aufrufe von %code% für einen Tensor. Mit %code% kann ich die Performance deutlich verbessern, aber ich versinke dabei die Tensor-Struktur. Dies gibt mir einen schnellen Weg, meinen ursprünglichen Tensor zu rekonstruieren, vereinfacht.

    
___ antwort5002833 ___

Sie müssen natürlich einige Informationen zur Listenstruktur speichern, weil %code% .

Wenn %code% , dann ist die Listenstruktur durch %code% gegeben und Sie können sie mit %code% rekonstruieren. ZB

%Vor%

(Die% man-Seite %code% hat tatsächlich ein ähnliches Beispiel namens %code% .)

Wenn %code% kein Array ist, können Sie Folgendes versuchen:

%Vor%     
___ qstnhdr ___ Mathematica: rekonstruiere eine beliebige verschachtelte Liste nach Flatten ___ tag123wolframmathematica ___ Wolfram Mathematica ist ein Computeralgebrasystem und eine Programmiersprache von Wolfram Research. Mathematica hat eine eigene Stack Exchange-Site unter http://mathematica.stackexchange.com/. ___
aaz 15.02.2011, 11:02
quelle
1

Ich bin mir nicht sicher, was Sie mit Compile zu tun versuchen. Es wird verwendet, wenn Sie prozedurale oder funktionale Ausdrücke sehr schnell auf numerischen Werten auswerten wollen, also glaube ich nicht, dass es hier hilft. Wenn wiederholte Berechnungen von D [f, ...] Ihre Leistung behindern, können Sie sie mit etwas vorberechnen und speichern Table[d[k]=D[f,{{x,y},k}],{k,0,kk}];

Rufen Sie dann einfach d [k] an, um die k-te Ableitung zu erhalten.

    
joebolte 15.02.2011 07:01
quelle
1

Ich wollte nur die exzellenten Lösungen von aaz und Janus aktualisieren. Es scheint, dass, zumindest in Mathematica 9.0.1.0 auf Mac OSX, die Zuordnung (siehe aaz's Lösung)

%Vor%

schlägt fehl. Wenn wir jedoch

verwenden %Vor%

stattdessen gelingt es uns. Dasselbe gilt natürlich für den ReplaceAll -Aufruf in Janus 'Job-Sicherheitsversion.

Für ein gutes Maß schließe ich meine eigene Funktion ein.

%Vor%

Es mag ein bisschen wie ein Cheat erscheinen, den ursprünglichen Ausdruck in der Funktion zu verwenden, aber wie aaz zeigt, brauchen wir einige Informationen aus dem ursprünglichen Ausdruck. Während Sie es nicht alle benötigen, um eine einzelne Funktion zu haben, die unflatten haben kann, ist alles notwendig.

Meine Bewerbung ist der von Janus ähnlich: Parallele Aufrufe von Simplify für einen Tensor. Mit ParallelTable kann ich die Performance deutlich verbessern, aber ich versinke dabei die Tensor-Struktur. Dies gibt mir einen schnellen Weg, meinen ursprünglichen Tensor zu rekonstruieren, vereinfacht.

    
Rico Picone 17.08.2013 02:05
quelle

Tags und Links