Предположим, что у меня есть функция f()
, и я хочу использовать ее в my_file.m
, которая является script.
my_file.m
?f.m
. Как мне это назвать в my_file.m
?Я прочитал онлайн-документацию, но было неясно, как лучше всего это сделать.
Начиная с версии R2016b, вы можете иметь локальные функции в скриптах, например:
data = 1:10; %# A vector of data
squaredData = f(data); %# Invoke the local function
function y = f(x)
y = x.^2;
end
До выпуска R2016b единственным тип функции, который может быть определен внутри MATLAB script, был анонимная функция. Например:
data = 1:10; %# A vector of data
f = @(x) x.^2; %# An anonymous function
squaredData = f(data); %# Invoke the anonymous function
Обратите внимание, что анонимные функции лучше подходят для простых операций, поскольку они должны быть определены в одном выражении. Для более сложных функций вам придется определять их в своих файлах, размещать их где-то на пути MATLAB, чтобы сделать их доступными для вашего script, а затем вызовите их из script, как и любую другую функцию.
Как мне обойти это ограничение, нужно превратить мои скрипты в функции, которые не принимают аргументов (если мне нужны переменные из глобального пространства имен, я либо явно передаю их в функции, либо использую "evalin", чтобы захватить их. )
Затем вы можете определить все дополнительные функции, которые вам нужны в "script". Это взломать, но я нашел его достаточно мощным в тех случаях, когда мне нужно несколько нетривиальных функций.
EDIT: Здесь упрощенный пример. Все это может находиться в одном файле.
function [] = myScriptAsAFunction()
img = randn(200);
img = smooth(img);
figure(1);
imagesc(img);
axis image;
colorbar;
end
function simg = smooth(img)
simg = img / 5;
end
Вы можете сделать что-то вроде этого (если ваш файл имеет имя my_file.m
):
function my_file
%script here
end
function out = f(in)
%function here
end
Если вы нажмете кнопку запуска, функция my_file
будет выполнена по умолчанию.
1) Вы не можете вставить функцию внутри script.
2) Убедитесь, что f.m находится на вашем пути или в текущем каталоге, и вы можете вызвать его, как любую другую функцию.
f
в его примере) из вашего скрипта ( my_file
в его примере).
Начиная с R2016b, вы можете определить локальные функции в script.
x = 1;
y = add1(x);
function z = add1(x)
z = x + 1;
end
Я реализовал решение от John, и я нашел его полезным. Но есть несколько предостережений (в Octave, Matlab, возможно, ведет себя аналогично):
Если код внутри вашей основной функции содержит clear all
до использования вспомогательной функции, это не сработает. В файле test3.m
комментирование/раскомментирование clear all
приводит к тому, что код работает/не работает.
function [] = test3()
%clear all
a = myfunc( 1 );
a
endfunction;
%---------------------------------
% Auxiliary functions
function retval = myfunc( a )
retval = 2 * a;
endfunction;
From Похоже, что при запуске script выполняется первый проход, где выполняются внешние функции кода (в этом случае такой код отсутствует), а функции определены (в этом случае test3
и myfunc
) добавляются в рабочую область. Второй проход будет выполнять основную функцию, которая не найдет myfunc
, если clear all
активен.
Как указано chessofnerd, из-за коробки переменные в вашей основной функции не попадают в рабочую область.
В образцовом файле может быть много функций. Но только первый может действовать как основная функция, когда вы запускаете файл. Другие могут использоваться только в этом файле. Для некоторой ситуации вы хотите определить большую функцию. Вы можете разделить его на более мелкие функции и определить ниже.
Однако самый простой способ найти ответ - попробовать ~