Julia: anonyme Funktionen hinzufügen

8

Wenn ich einige anonyme Funktionen a(x) und b(x) als

definiere %Vor%

es wäre hilfreich für rekursive Probleme, sie zusammenzufügen, sagen wir über die Dauer einer Schleife:

%Vor%

wo das Ziel wäre, dies intern jede Schleifeniteration als

darzustellen %Vor%

Aber das scheitert und gibt einen Fehler zurück. Ich gehe davon aus, dass der Aufruf des neuen a(x) wie folgt interpretiert wird: a(2) = 2 -> x^2 + x^2 + ... + x^2 + 2x

%Vor%

Gibt es einen Weg dazu?

    
Daniel R. Livingston 14.06.2017, 16:53
quelle

3 Antworten

7

Mit können Sie genau das tun, wonach Sie suchen let keyword :

%Vor%

Erläuterung

Das Keyword " let ermöglicht dies Erstellen Sie einen Block mit lokalem Bereich, und geben Sie die letzte Anweisung im Block an den Aufruferbereich zurück. (Im Gegensatz dazu zum Beispiel mit dem Schlüsselwort begin ) führt keinen neuen Bereich ein).

Wenn Sie dem Schlüsselwort let eine Folge von "Zuweisungen" übergeben, werden diese zu Variablen, die lokal für den Block sind (so dass Sie Variablennamen wiederverwenden können, die bereits in Ihrem Arbeitsbereich vorhanden sind). Die Deklaration let a = a ist absolut gültig und bedeutet "erstelle eine lokale Variable a , die von der a Variable des äußeren Bereichs initialisiert wird --- obwohl wir wirklich löschen möchten hätten wir es stattdessen so schreiben können:

%Vor%

Wenn Sie eine a_old -Variable verwenden möchten, können Sie dies stattdessen auch einfach tun:
for i=1:5; a_old = a; a = x-> a_old(x) + b(x); end

let ist ein sehr nützliches Schlüsselwort: Es ist äußerst praktisch für die Erstellung von Vor-Ort-Schließungen; genau das haben wir hier gemacht: Wir haben eine Schließung gemacht, bei der die "lokale Variable a " im Wesentlichen zu einer geschlossenen Variable wurde.

PS. Da Matlab erwähnt wurde, was du machst, wenn du a = @ (x) a(x) + b(x) in Matlab auswertest, besteht im Wesentlichen darin, einen Abschluss zu erstellen. In Matlab können Sie alle geschlossenen Variablen (dh den "Arbeitsbereich" des Abschlusses) mithilfe der functions überprüfen. Befehl

PPS. Der Dr. Livingstone, nehme ich an?

    
Tasos Papastylianou 14.06.2017, 23:30
quelle
5

Das Verwenden von Polynom-Paketen könnte ein Weg sein. Das würde gehen:

%Vor%

Der Grund dafür ist, dass das gewünschte Verhalten im Wesentlichen die symbolische Manipulation von Funktionen ist. Julia funktioniert nicht so (es ist ein Compiler - oder AOT-Compiler), aber es ist flexibel. Wenn Züchterfunktionen als Polynome benötigt werden, könnte ein symbolisches Mathe-Paket helfen (es gibt SymPy, aber ich habe es nicht benutzt).

    
Dan Getz 14.06.2017 18:46
quelle
1

Dies:

%Vor%

ist ein rekursiver Aufruf ohne Abbruchbedingung. Es hat nichts mit Julia zu tun. Sobald Sie dies definieren, wurde die vorherige Definition ( x^2 ) außer Kraft gesetzt und hat nichts mit dem Stack oder Ihrem Ergebnis zu tun. Es existiert nicht mehr. Was Sie versuchen, ist:

%Vor%

usw. Die 2 * 2 wird nicht einmal ersetzt, ich habe es einfach geschrieben, um klar zu sein. Wahrscheinlich möchtest du

definieren %Vor%

BEARBEITEN

Ich sehe jetzt von MATLAB kommend, dass Sie erwarten, dass die Syntax etwas anderes bedeutet. Was Sie in fast allen Sprachen geschrieben haben, ist ein rekursiver Aufruf, den Sie nicht wollen. Was Sie wollen, ist etwas wie:

%Vor%

Dieser Codeabschnitt übernimmt alle Funktionen, die x akzeptieren und ein + zwischen den resultierenden Aufrufen generieren. Dies funktioniert mit allem, mit dem '+' arbeitet. Also:

%Vor%

ist die Funktion, die Sie brauchen.

    
kabanus 14.06.2017 16:58
quelle