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

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

  1. Можно ли определить функцию в my_file.m?
  2. Если нет, предположим, что я определил это в f.m. Как я могу назвать это в my_file.m?

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

71 голос | спросил Viktor 19 MarpmSat, 19 Mar 2011 19:48:05 +03002011-03-19T19:48:05+03:0007 2011, 19:48:05

6 ответов


0

Начиная с выпуска 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, была анонимной функцией . Например:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

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

ответил gnovice 22 MarpmTue, 22 Mar 2011 20:28:48 +03002011-03-22T20:28:48+03:0008 2011, 20:28:48
0

Вы можете сделать что-то подобное (при условии, что ваш файл называется my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

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

ответил Oneiros 6 32013vEurope/Moscow11bEurope/MoscowWed, 06 Nov 2013 17:23:19 +0400 2013, 17:23:19
0

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

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

ответил Rich C 19 MarpmSat, 19 Mar 2011 20:05:12 +03002011-03-19T20:05:12+03:0008 2011, 20:05:12
0

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

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end
ответил Suever 11 J000000Monday16 2016, 16:37:22
0

Я реализовал решение Джона и нашел его полезным. Но есть несколько предостережений (в Octave; возможно, Matlab ведет себя аналогично):

  1. Если код внутри вашей главной функции содержит 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;
    

    Из Похоже, что при запуске сценария выполняется первый проход, на котором выполняется код вне функций (в данном случае такого кода нет) и определяются функции (в данном случае test3 и myfunc) добавляются в рабочую область. Второй проход будет выполнять основную функцию, которая не найдет myfunc if clear all активен.

  2. Как указывает chessofnerd, стандартные переменные в вашей основной функции не попадают в рабочую область.

ответил sancho.s 26 MarpmSat, 26 Mar 2016 15:56:37 +03002016-03-26T15:56:37+03:0003 2016, 15:56:37
0

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

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

ответил Ayo Dollars 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 22 Sep 2015 04:34:38 +0300 2015, 04:34:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132