Чи можу я в MATLAB мати сценарій та визначення функції в одному файлі?


82

Припустимо, у мене є функція, f()і я хочу використовувати її в my_file.m, яка є сценарієм.

  1. Чи можна визначити функцію в my_file.m?
  2. Якщо ні, то припустимо, що це визначено в f.m. Як мені це зателефонувати my_file.m?

Я прочитав онлайн-документацію, але не було зрозуміло, який найкращий спосіб це зробити.


4
Зверніть увагу, що ви можете помістити функції в скрипти в Octave.
Jeremiah Willcock

2
Розгляньте цю відповідь на способи впорядкування коду stackoverflow.com/a/3569946/18775
Антон Данейко

Дуже рекомендую поглянути на stackoverflow.com/questions/17315586 / ...
URL87

4
Справжнє запитання має бути таким: Кому в Mathworks я скаржуся, щоб виправити цю смішну помилку?
Drysdam

3
Починаючи з MATLAB 2016b, функції можна визначати в сценаріях. Я не впевнений, чому вони чекали 32 роки, щоб додати цю досить основну функцію.
onewhaleid

Відповіді:


49

З моменту випуску 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, щоб зробити їх доступними для вашого сценарію, а потім викликати їх із вашого сценарію, як і будь-яку іншу функцію.


37

Я обходжу це обмеження, перетворюючи мої сценарії на функції, які не беруть аргументів (якщо мені потрібні змінні з глобального простору імен, я або явно передаю їх у функцію, або використовую "evalin", щоб захопити їх).

Тоді ви можете визначити всі додаткові функції, які вам потрібні, у "сценарії". Це хакерство, але я виявив, що він досить потужний у тих випадках, коли мені потрібні кілька нетривіальних функцій.

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. Якщо у вас так багато змінних і графіків, що плавають навколо, ви не можете їх відстежувати, ви використовуєте недостатньо функцій.
Bi Rico

1
Чи можете ви, будь ласка, включити зразок реалізації цього "хака"? Я не можу зрозуміти, як це працює.
Джеймс Тейлор,

1
Зауважте, одна проблема цього підходу полягає в тому, що змінні ніколи не потрапляють у вашу робочу область, коли функція виходить. Це може бути проблемою, якщо ви хочете відтворити / переглянути / використовувати ці змінні в кінці сценарію.
chessofnerd

1
@chessofnerd Коли у мене виникає проблема, я або повертаю змінні у виведенні функції, або використовую assignin.
Джон

1
@ John, я особисто вважаю, що трохи боляче повертати всі змінні окремо, на відміну від того, щоб вони з'являлися в робочому просторі самостійно. Тим не менш, я ніколи не чув про це assignin. Це чудова функція, яку я, можливо, використовую більше!
chessofnerd

19

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

function my_file
   %script here
end

function out = f(in)
   %function here
end

Якщо натиснути кнопку запуску, функція my_fileбуде виконана за замовчуванням.


2
Чи це відрізняється від відповіді Джона?
sancho.s ReinstateMonicaCellio

7

1) Ви не можете вкласти функцію всередину сценарію.

2) Переконайтеся, що fm знаходиться на вашому шляху або в поточному каталозі, і ви можете викликати його як будь-яку іншу функцію.


Ви можете вкласти функцію в скрипт, якщо дотримуєтесь запропонованих @Oneiros. Ви навіть можете викликати свою функцію ( fу його прикладі) із вашого сценарію ( my_fileу його прикладі).
marcelocra


3

Я застосував рішення від Джона , і я знайшов його корисним. Але є кілька застережень (в 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якщо clear allвона активна.

  2. Як зазначає chessofnerd, нестандартні змінні у вашій головній функції не переходять у робочу область.


2

Ви можете мати багато функцій у зразку файлу. Але лише перша може виконувати функції головної функції під час запуску файлу. Інші можуть бути використані лише у цьому файлі. Для певної ситуації потрібно визначити велику функцію. Ви можете розділити його на менші функції та визначити під ним.

Однак найпростіший спосіб знайти відповідь - спробувати ~

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.