Можно ли в MATLAB иметь сценарий и определение функции в одном файле?

60

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

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

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

  • 3
    Обратите внимание, что вы можете поместить функции в скрипты в Octave.
  • 2
    Подумайте над этим ответом, чтобы узнать, как организовать ваш код stackoverflow.com/a/3569946/18775
Показать ещё 3 комментария
Теги:
file
function

7 ответов

40

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

33

Как мне обойти это ограничение, нужно превратить мои скрипты в функции, которые не принимают аргументов (если мне нужны переменные из глобального пространства имен, я либо явно передаю их в функции, либо использую "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
  • 6
    +1, это действительно раздражает, когда я вижу все ясно; закрыть все; в верхней части сценария Matlab. Если у вас так много переменных и графиков, вы не можете отследить их, значит, вы не используете достаточно функций.
  • 1
    Можете ли вы включить пример реализации этого «хака»? Я не могу понять, как это работает.
Показать ещё 4 комментария
16

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

function my_file
   %script here
end

function out = f(in)
   %function here
end

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

  • 2
    Это отличается от ответа Джона?
  • 0
    нет, это тот же подход
5

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

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

  • 0
    Вы можете вложить функцию в скрипт, если вы следуете тому, что предлагает @Oneiros. Вы даже можете вызвать свою функцию ( f в его примере) из вашего скрипта ( my_file в его примере).
4

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

x = 1;
y = add1(x);

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

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

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню