Kann ich in MATLAB ein Skript und eine Funktionsdefinition in derselben Datei haben?

81

Angenommen, ich habe eine Funktion f()und möchte sie in my_file.meinem Skript verwenden.

  1. Ist es möglich, die Funktion in definiert zu haben my_file.m?
  2. Wenn nicht, nehme ich an, ich habe es in definiert f.m. Wie rufe ich es an my_file.m?

Ich habe die Online-Dokumentation gelesen, aber es war nicht klar, wie dies am besten funktioniert.

Viktor
quelle
4
Beachten Sie, dass Sie in Octave Funktionen in Skripten einfügen können.
Jeremiah Willcock
2
Betrachten Sie diese Antwort für Möglichkeiten, Ihren Code zu organisieren stackoverflow.com/a/3569946/18775
Anton Daneyko
Sehr zu empfehlen, einen Blick auf stackoverflow.com/questions/17315586/…
URL87
4
Die eigentliche Frage sollte lauten: Bei wem bei Mathworks beschwere ich mich, um diesen lächerlichen Fehler zu beheben?
Drysdam
3
Ab MATLAB 2016b können Funktionen in Skripten definiert werden. Ich bin mir nicht sicher, warum sie 32 Jahre darauf gewartet haben, diese ziemlich grundlegende Funktion hinzuzufügen.
Onewhaleid

Antworten:

48

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.

gnovice
quelle
37

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
John
quelle
6
+1, es nervt mich wirklich, wenn ich alles klar sehe; alle schließen; oben in einem Matlab-Skript. Wenn so viele Variablen und Diagramme im Umlauf sind, können Sie sie nicht verfolgen, und Sie verwenden nicht genügend Funktionen.
Bi Rico
1
Können Sie bitte eine Beispielimplementierung dieses "Hacks" hinzufügen? Ich kann nicht herausfinden, wie das funktioniert.
James Taylor
1
Beachten Sie, dass ein Problem bei diesem Ansatz darin besteht, dass die Variablen beim Beenden der Funktion niemals in Ihren Arbeitsbereich gelangen. Dies kann ein Problem sein, wenn Sie diese Variablen am Ende des Skripts abspielen / suchen / verwenden möchten.
Schachofnerd
1
@chessofnerd Wenn ich das Problem habe, gebe ich entweder die Variablen in der Funktionsausgabe zurück oder verwende Assignin.
John
1
@John, ich persönlich finde es etwas mühsam, alle Variablen einzeln zurückgeben zu müssen, anstatt sie alleine im Arbeitsbereich anzeigen zu lassen. Das heißt, ich hatte noch nie davon gehört assignin. Das ist eine nette Funktion, die ich vielleicht mehr benutze!
Schachofnerd
19

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_filestandardmäßig ausgeführt.

Oneiros
quelle
2
Unterscheidet sich das von der Antwort von John?
sancho.s ReinstateMonicaCellio
7

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.

Rich C.
quelle
Sie können eine Funktion in einem Skript verschachteln, wenn Sie den Vorschlägen von @Oneiros folgen. Sie können Ihre Funktion ( fin seinem Beispiel) sogar in Ihrem Skript ( my_filein seinem Beispiel) aufrufen .
Marcelocra
6

Ab R2016b können Sie lokale Funktionen innerhalb eines Skripts definieren.

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end
Suever
quelle
3

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):

  1. Wenn Code in Ihrer Hauptfunktion clear allvor der Verwendung der Zusatzfunktion enthalten ist, funktioniert er nicht. In der Datei funktioniert Code durch test3.mKommentieren / Auskommentieren clear 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 test3und myfunc) zum Arbeitsbereich hinzugefügt werden. Ein zweiter Durchgang würde die Hauptfunktion ausführen, die nicht finden würde, myfuncob sie clear allaktiv ist.

  2. Wie von chessofnerd hervorgehoben, werden die Variablen in Ihrer Hauptfunktion sofort nicht in den Arbeitsbereich verschoben.

sancho.s ReinstateMonicaCellio
quelle
2

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 ~

Ayo Dollar
quelle