MATLAB에서 동일한 파일에 스크립트와 함수 정의가있을 수 있습니까?


81

함수 가 있고 스크립트 인 f()에서 사용하고 싶다고 가정 my_file.m합니다.

  1. 함수를에 정의 할 수 my_file.m있습니까?
  2. 그렇지 않은 경우 f.m. 어떻게 부르 my_file.m나요?

온라인 설명서를 읽었지만이를 수행하는 가장 좋은 방법이 무엇인지 명확하지 않았습니다.


4
Octave의 스크립트에 함수를 넣을 수 있습니다.
Jeremiah Willcock 2011 년

2
코드를 구성하는 방법에 대해이 답변을 고려하십시오. stackoverflow.com/a/3569946/18775
Anton Daneyko 2013

아주 살펴 가지고하는 것이 좋습니다 stackoverflow.com/questions/17315586/...
URL87

4
진짜 질문은 다음과 같습니다. Mathworks에서이 어리석은 버그를 수정하기 위해 누구에게 불평합니까?
drysdam

3
MATLAB 2016b부터는 스크립트에서 함수를 정의 할 수 있습니다. 이 기본적인 기능을 추가하기 위해 32 년을 기다린 이유를 잘 모르겠습니다.
onewhaleid

답변:


48

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"을 사용하여 가져옵니다).

그런 다음 "스크립트"에서 필요한 모든 추가 기능을 정의 할 수 있습니다. 해킹이지만 몇 가지 사소하지 않은 기능이 필요한 경우 매우 강력하다는 것을 알았습니다.

편집 : 여기에 단순한 예가 있습니다. 이 모든 것이 단일 파일에있을 수 있습니다.

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
이 "해킹"의 샘플 구현을 포함 해 주시겠습니까? 이것이 어떻게 작동하는지 알아낼 수없는 것 같습니다.
James Taylor

1
이 접근 방식의 한 가지 문제는 함수가 종료 될 때 변수가 작업 공간으로 들어 가지 않는다는 것입니다. 스크립트가 끝날 때 해당 변수를 재생 /보기 / 사용하려는 경우 문제가 될 수 있습니다.
chessofnerd 2015 년

1
@chessofnerd 문제가 발생하면 함수 출력에 변수를 반환하거나 assignin을 사용합니다.
John

1
@John, 개인적으로 모든 변수를 작업 공간에 표시하는 것과는 반대로 모든 변수를 개별적으로 반환해야하는 것이 약간의 고통이라고 생각합니다. 즉, 나는 들어 본 적이 없습니다 assignin. 더 많이 사용할 수있는 깔끔한 기능입니다!
chessofnerd 2015 년

19

다음과 같이 할 수 있습니다 (파일 이름이이라고 가정 my_file.m).

function my_file
   %script here
end

function out = f(in)
   %function here
end

실행 버튼을 클릭하면 my_file기본적으로 기능 이 실행됩니다.


2
이것은 John의 대답과 다른가요?
sancho.s ReinstateMonicaCellio

7

1) 스크립트 안에 함수를 중첩 할 수 없습니다.

2) fm이 경로 또는 현재 디렉토리에 있는지 확인하고 다른 함수처럼 호출 할 수 있습니다.


@Oneiros가 제안한 내용을 따르면 스크립트 내부에 함수를 중첩 할 수 있습니다. f스크립트 (예제)에서 함수 ( 예제)를 호출 할 수도 있습니다 my_file.
marcelocra

6

R2016b 부터 스크립트 내에서 로컬 함수를 정의 할 수 있습니다.

x = 1;
y = add1(x);

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

3

John의 솔루션을 구현 했으며 유용하다는 것을 알았습니다. 그러나 몇 가지주의 사항이 있습니다 (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;
    

    스크립트를 실행하면 함수 외부의 코드가 실행되고 (이 경우에는 해당 코드가 없음) 정의 된 함수 (이 경우 test3myfunc)가 작업 공간에 추가 되는 첫 번째 패스가있는 것 같습니다 . 두 번째 패스는 메인 기능을 실행하며이 기능 은 활성 상태 myfunc인지 찾지 않습니다 clear all.

  2. chessofnerd가 지적한 것처럼 기본 함수의 변수는 작업 공간으로 이동하지 않습니다.


2

샘플 파일에 많은 기능이있을 수 있습니다. 그러나 파일을 실행할 때 첫 번째 기능 만 기본 기능으로 작동 할 수 있습니다. 다른 파일은이 파일에서만 사용할 수 있습니다. 어떤 상황에서는 큰 기능을 정의하고 싶습니다. 더 작은 함수로 분리하고 그 아래에 정의 할 수 있습니다.

하지만 답을 찾는 가장 간단한 방법은 시도해 보는 것입니다 ~

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.