Angenommen, ich habe eine Funktion f()
und möchte sie in my_file.m
einem Skript verwenden.
- Ist es möglich, die Funktion in definiert zu haben
my_file.m
? - Wenn nicht, nehme ich an, ich habe es in definiert
f.m
. Wie rufe ich es anmy_file.m
?
Ich habe die Online-Dokumentation gelesen, aber es war nicht klar, wie dies am besten funktioniert.
Antworten:
Ab Release R2016b können Sie lokale Funktionen in Skripten haben , wie zum Beispiel:
data = 1:10; % A vector of data squaredData = f(data); % Invoke the local function function y = f(x) y = x.^2; end
Vor der Veröffentlichung von R2016b war der einzige Funktionstyp , der in einem MATLAB-Skript definiert werden konnte, eine anonyme Funktion . Zum Beispiel:
data = 1:10; % A vector of data f = @(x) x.^2; % An anonymous function squaredData = f(data); % Invoke the anonymous function
Beachten Sie, dass anonyme Funktionen besser für einfache Operationen geeignet sind, da sie in einem einzigen Ausdruck definiert werden müssen. Für kompliziertere Funktionen müssen Sie sie in ihren eigenen Dateien definieren, sie irgendwo im MATLAB-Pfad platzieren , um sie für Ihr Skript zugänglich zu machen, und sie dann wie jede andere Funktion von Ihrem Skript aus aufrufen.
quelle
Um diese Einschränkung zu umgehen, verwandle ich meine Skripte in Funktionen, die keine Argumente enthalten (wenn ich Variablen aus dem globalen Namespace benötige, übergebe ich sie entweder explizit in der Funktion oder verwende "evalin", um sie abzurufen.)
Dann können Sie alle zusätzlichen Funktionen definieren, die Sie im "Skript" benötigen. Es ist ein Hack, aber ich habe festgestellt, dass er in den Fällen, in denen ich mehrere nicht triviale Funktionen benötige, ziemlich mächtig ist.
EDIT: Hier ist ein vereinfachtes Beispiel. All dies kann sich in einer einzigen Datei befinden.
function [] = myScriptAsAFunction() img = randn(200); img = smooth(img); figure(1); imagesc(img); axis image; colorbar; end function simg = smooth(img) simg = img / 5; end
quelle
assignin
. Das ist eine nette Funktion, die ich vielleicht mehr benutze!Sie können so etwas tun (vorausgesetzt, Ihre Datei hat den Namen
my_file.m
):function my_file %script here end function out = f(in) %function here end
Wenn Sie auf die Schaltfläche Ausführen klicken, wird die Funktion
my_file
standardmäßig ausgeführt.quelle
1) Sie können eine Funktion nicht in einem Skript verschachteln.
2) Stellen Sie sicher, dass sich fm auf Ihrem Pfad oder im aktuellen Verzeichnis befindet und Sie es wie jede andere Funktion aufrufen können.
quelle
f
in seinem Beispiel) sogar in Ihrem Skript (my_file
in seinem Beispiel) aufrufen .Ab R2016b können Sie lokale Funktionen innerhalb eines Skripts definieren.
x = 1; y = add1(x); function z = add1(x) z = x + 1; end
quelle
Ich habe die Lösung von John implementiert und fand sie nützlich. Es gibt jedoch einige Einschränkungen (in Octave; Matlab verhält sich möglicherweise ähnlich):
Wenn Code in Ihrer Hauptfunktion
clear all
vor der Verwendung der Zusatzfunktion enthalten ist, funktioniert er nicht. In der Datei funktioniert Code durchtest3.m
Kommentieren / Auskommentierenclear all
.function [] = test3() %clear all a = myfunc( 1 ); a endfunction; %--------------------------------- % Auxiliary functions function retval = myfunc( a ) retval = 2 * a; endfunction;
Es scheint, als gäbe es beim Ausführen eines Skripts einen ersten Durchgang, in dem Code außerhalb von Funktionen ausgeführt wird (in diesem Fall gibt es keinen solchen Code) und definierte Funktionen (in diesem Fall
test3
undmyfunc
) zum Arbeitsbereich hinzugefügt werden. Ein zweiter Durchgang würde die Hauptfunktion ausführen, die nicht finden würde,myfunc
ob sieclear all
aktiv ist.Wie von chessofnerd hervorgehoben, werden die Variablen in Ihrer Hauptfunktion sofort nicht in den Arbeitsbereich verschoben.
quelle
Sie können viele Funktionen in einer Beispieldatei haben. Aber nur die erste kann als Hauptfunktion fungieren, wenn Sie die Datei ausführen. Andere können lediglich in dieser Datei verwendet werden. In einigen Situationen möchten Sie eine große Funktion definieren. Sie können es in kleinere Funktionen aufteilen und darunter definieren.
Der einfachste Weg, die Antwort zu finden, ist jedoch ein Versuch ~
quelle