В MATLAB, могу ли я иметь script и определение функции в том же файле?

Предположим, что у меня есть функция f(), и я хочу использовать ее в my_file.m, которая является script.

  • Возможно ли, чтобы функция была определена в my_file.m?
  • Если нет, предположим, что он определен в f.m. Как мне это назвать в my_file.m?

Я прочитал онлайн-документацию, но было неясно, как лучше всего это сделать.

Ответ 1

Начиная с версии 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, как и любую другую функцию.

Ответ 2

Как мне обойти это ограничение, нужно превратить мои скрипты в функции, которые не принимают аргументов (если мне нужны переменные из глобального пространства имен, я либо явно передаю их в функции, либо использую "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

Ответ 3

Вы можете сделать что-то вроде этого (если ваш файл имеет имя my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

Если вы нажмете кнопку запуска, функция my_file будет выполнена по умолчанию.

Ответ 4

1) Вы не можете вставить функцию внутри script.

2) Убедитесь, что f.m находится на вашем пути или в текущем каталоге, и вы можете вызвать его, как любую другую функцию.

Ответ 5

Начиная с R2016b, вы можете определить локальные функции в script.

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end

Ответ 6

Я реализовал решение от 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, из-за коробки переменные в вашей основной функции не попадают в рабочую область.

Ответ 7

В образцовом файле может быть много функций. Но только первый может действовать как основная функция, когда вы запускаете файл. Другие могут использоваться только в этом файле. Для некоторой ситуации вы хотите определить большую функцию. Вы можете разделить его на более мелкие функции и определить ниже.

Однако самый простой способ найти ответ - попробовать ~