Załóżmy, że mam funkcję f()
i chcę jej użyć my_file.m
, czyli skrypt.
- Czy można mieć funkcję zdefiniowaną w
my_file.m
? - Jeśli nie, załóżmy, że mam to zdefiniowane w
f.m
. Jak mam to zgłosićmy_file.m
?
Przeczytałem dokumentację online, ale nie było jasne, jaki jest najlepszy sposób, aby to zrobić.
Odpowiedzi:
Od wersji R2016b możesz mieć lokalne funkcje w skryptach , na przykład:
data = 1:10; % A vector of data squaredData = f(data); % Invoke the local function function y = f(x) y = x.^2; end
Przed wydaniem R2016b jedynym typem funkcji, który można było zdefiniować w skrypcie MATLAB, była funkcja anonimowa . Na przykład:
data = 1:10; % A vector of data f = @(x) x.^2; % An anonymous function squaredData = f(data); % Invoke the anonymous function
Zwróć uwagę, że funkcje anonimowe lepiej nadają się do prostych operacji, ponieważ muszą być zdefiniowane w jednym wyrażeniu. W przypadku bardziej skomplikowanych funkcji będziesz musiał zdefiniować je we własnych plikach, umieścić je gdzieś na ścieżce MATLAB, aby były dostępne dla twojego skryptu, a następnie wywołać je ze swojego skryptu, tak jak każdą inną funkcję.
źródło
Sposobem na obejście tego ograniczenia jest przekształcenie moich skryptów w funkcje, które nie pobierają żadnych argumentów (jeśli potrzebuję zmiennych z globalnej przestrzeni nazw, albo jawnie przekazuję je w funkcji, albo używam „evalin”, aby je pobrać).
Następnie możesz zdefiniować wszystkie dodatkowe funkcje, których potrzebujesz w „skrypcie”. To hack, ale odkryłem, że jest dość potężny w przypadkach, w których potrzebuję kilku nietrywialnych funkcji.
EDYCJA: Oto uproszczony przykład. Wszystko to może znajdować się w jednym pliku.
function [] = myScriptAsAFunction() img = randn(200); img = smooth(img); figure(1); imagesc(img); axis image; colorbar; end function simg = smooth(img) simg = img / 5; end
źródło
assignin
. To fajna funkcja, której mogę używać częściej!Możesz zrobić coś takiego (zakładając, że twój plik ma nazwę
my_file.m
):function my_file %script here end function out = f(in) %function here end
Jeśli klikniesz przycisk Uruchom, funkcja
my_file
zostanie wykonana domyślnie.źródło
1) Nie możesz zagnieździć funkcji wewnątrz skryptu.
2) Upewnij się, że fm znajduje się na Twojej ścieżce lub w bieżącym katalogu i możesz go wywołać jak każdą inną funkcję.
źródło
f
w jego przykładzie) z poziomu skryptu (my_file
w jego przykładzie).Od R2016b można definiować funkcje lokalne.
x = 1; y = add1(x); function z = add1(x) z = x + 1; end
źródło
Wdrożyłem rozwiązanie autorstwa Johna i uznałem je za przydatne. Ale jest kilka zastrzeżeń (w Octave; Matlab prawdopodobnie zachowuje się podobnie):
Jeśli kod wewnątrz funkcji głównej zawiera
clear all
przed użyciem funkcji pomocniczej, nie zadziała.test3.m
Komentowanie / usuwanie komentarzy w plikuclear all
powoduje, że kod działa / nie działa.function [] = test3() %clear all a = myfunc( 1 ); a endfunction; %--------------------------------- % Auxiliary functions function retval = myfunc( a ) retval = 2 * a; endfunction;
Z Wydaje się, że po uruchomieniu skryptu jest pierwsze przejście, w którym wykonywany jest kod poza funkcjami (w tym przypadku nie ma takiego kodu), a funkcje zdefiniowane (w tym przypadku
test3
imyfunc
) są dodawane do obszaru roboczego. Drugi przebieg wykonywałby główną funkcję, która nie znajdowałaby,myfunc
gdybyclear all
była aktywna.Jak wskazał chessofnerd, po wyjęciu z pudełka zmienne w twojej głównej funkcji nie trafiają do obszaru roboczego.
źródło
Przykładowy plik może zawierać wiele funkcji. Ale tylko pierwsza z nich może działać jako główna funkcja podczas uruchamiania pliku. Inne mogą być używane tylko w tym pliku. W niektórych sytuacjach chcesz zdefiniować dużą funkcję. Możesz podzielić go na mniejsze funkcje i zdefiniować poniżej.
Jednak najprostszym sposobem znalezienia odpowiedzi jest wypróbowanie ~
źródło