[matlab] MATLAB에서 파일 당 하나 이상의 함수를 정의하고 해당 파일 외부에서 함수에 액세스 할 수 있습니까?

EE에서 학사 학위를 공부할 때 MATLAB은 각 기능이 하나의 라이너 인 경우에도 자체 파일에 정의되도록 요구했습니다.

지금 대학원을 공부하고 있는데 MATLAB에서 프로젝트를 작성해야합니다. 최신 버전의 MATLAB에 여전히 이것이 필요합니까?

파일에 둘 이상의 기능을 넣을 수 있다면 이에 대한 제한이 있습니까? 예를 들어 파일 외부의 모든 함수에 액세스 할 수 있습니까? 아니면 파일과 이름이 같은 함수에만 액세스 할 수 있습니까?

참고 : MATLAB 릴리스 R2007b를 사용하고 있습니다.



답변

m 파일의 첫 번째 함수 (예 : main 함수 )는 해당 m 파일이 호출 될 때 호출됩니다. 되지 필요한 주요 기능은 m-파일과 같은 이름을 가지고 있지만, 명확성을 위해 그것을 해야한다 . 함수와 파일 이름이 다르면 파일 이름 을 사용하여 기본 함수를 호출해야합니다.

로컬 함수 (또는 이전 용어에서 “하위 함수”) 라고하는 m 파일의 모든 후속 함수는 해당 m 파일 의 기본 함수 및 기타 로컬 함수 만 호출 할 수 있습니다. 다른 m 파일의 함수는이를 호출 할 수 없습니다. 범위 지정 동작은 여전히 ​​동일하지만 R2016b부터는 스크립트에 로컬 함수를 추가 할 수도 있습니다 (즉, 스크립트 내에서만 호출 할 수 있음).

또한 다른 함수 내에서 함수를 선언 할 수도 있습니다. 이를 중첩 함수 라고하며 중첩 된 함수 내에서만 호출 할 수 있습니다. 또한 중첩 된 함수의 변수에 액세스 할 수 있으므로 작업하기가 약간 까다 롭지 만 매우 유용합니다.

생각할 음식 더 …

SCFrenchJonas 의 답변에서 언급 한 것처럼 함수 핸들 을 출력 인수로 전달하는 것과 같이 위에서 설명한 일반적인 함수 범위 지정 동작에는 몇 가지 방법이 있습니다 (R2013b부터 시작하여 함수에 의해 촉진됨 ). 그러나 함수와 파일을 구성하는 더 나은 옵션이있을 수 있으므로 그러한 트릭에 의지하는 습관을들이는 것은 권하지 않습니다.localfunctions

예를 들어, 당신이 주요 기능이 있다고 가정 해 보자 Am 행 파일을 A.m로컬 기능과 함께 D, E하고 F. 이제 두 개의 다른 관련 기능을 가지고 가정 해 봅시다 BCm-파일 B.mC.m당신은 또한 호출 할 수 할 것인지, 각각, D, E,와 F. 다음과 같은 옵션이 있습니다.

  • 넣고 D, E그리고 F그들을 호출하는 다른 기능을 허용, 자신의 별도의 m-파일의 각. 단점은 이러한 기능의 범위가 큰 단지에 한정되지 않는 것입니다 A, B그리고 C하지만, 거꾸로이 매우 간단하다는 것이다.

  • 크리에이트 defineMyFunctions와 (조나스 ‘예처럼) m-파일을 D, E그리고 F지역의 기능과 주요 기능으로 단순히 반환 그들에게 핸들을 작동합니다. 이것은 당신이 유지할 수 있습니다 D, E그리고 F같은 파일에 있지만 호출 할 수있는 기능 이후 이러한 기능의 범위에 대해 아무것도하지 않는 defineMyFunctions그들을 호출 할 수 있습니다. 그런 다음 함수 핸들을 인수로 전달하여 필요한 위치에 있는지 확인해야합니다.

  • 복사 D, EFB.mC.m지역의 기능을한다. 이것은 사용법의 범위를 단지 A, BC로 제한하지만 다른 위치에 동일한 코드의 사본이 3 개 있기 때문에 코드 업데이트 및 유지 관리가 악몽이됩니다.

  • 개인 기능을 사용하십시오 ! 당신이있는 경우 A, B그리고 C같은 디렉토리에, 당신이라는 하위 디렉토리 생성 할 수 있습니다 private및 장소 D, E그리고 F거기에 별도의 m-파일로 각. 이것은 범위를 제한하여 바로 위의 디렉토리에있는 함수 (예 A: B, 및 C) 만 호출 할 수 있으며 동일한 위치 (여전히 다른 m 파일)에 함께 유지합니다.

    myDirectory/
        A.m
        B.m
        C.m
        private/
            D.m
            E.m
            F.m

이 모든 것은 귀하의 질문의 범위를 벗어난 것이며, 아마도 당신이 필요로하는 것보다 더 자세 할 것입니다. 😉


답변

일반적으로 귀하의 질문에 대한 답변은 아니오입니다. 파일 당 두 개 이상의 외부에서 보이는 기능을 정의 할 수 없습니다. 함수 핸들을 로컬 함수로 반환 할 수 있으며 편리한 방법은 구조체의 필드를 만드는 것입니다. 예를 들면 다음과 같습니다.

function funs = makefuns
  funs.fun1=@fun1;
  funs.fun2=@fun2;
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

사용 방법은 다음과 같습니다.

>> myfuns = makefuns;
>> myfuns.fun1(5)
ans =
     5
>> myfuns.fun2()
ans =
     1


답변

단일 파일에 개별적으로 액세스 가능한 여러 기능을 갖는 유일한 방법객체 지향 프로그래밍을 사용하여 정적 방법 을 정의하는 것 입니다. 당신은 기능에 액세스 것 myClass.static1(), myClass.static2()

OOP 기능은 R2008a 이후 공식적으로 만 지원되므로, 문서화되지 않은 오래된 OOP 구문을 사용하지 않는 한 @gnovice에서 설명한대로 대답은 ‘아니오 입니다.

편집하다

외부에서 액세스 할 수있는 파일 내에 여러 함수를 정의하는 또 다른 방법은 여러 함수 핸들 을 반환하는 함수를 만드는 것 입니다. 다시 말해, 정의 함수를로 호출 [fun1,fun2,fun3]=defineMyFunctions한 후 out1=fun1(inputs)등을 사용할 수 있습니다 .


답변

나는 SCFrench의 답변을 정말로 좋아 합니다. assignin 함수를 사용하여 함수를 작업 공간으로 직접 가져 오기 위해 쉽게 수정할 수 있음을 지적하고 싶습니다 . (이렇게하면 파이썬의 “import x에서 y 가져 오기”방식을 많이 생각 나게합니다)

function message = makefuns
  assignin('base','fun1',@fun1);
  assignin('base','fun2',@fun2);
  message='Done importing functions to workspace';
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

그런 다음 다음과 같이 사용하십시오.

>> makefuns
ans =
Done importing functions to workspace

>> fun1(123)
ans =
   123

>> fun2()
ans =
     1


답변

SCFrench의 답변과 동일한 줄을 따라 C # 스타일이 더 많이 회전합니다.

여러 정적 메소드를 포함하는 클래스를 만들고 싶습니다. 예를 들면 다음과 같습니다.

classdef Statistics

    methods(Static)
        function val = MyMean(data)
            val = mean(data);
        end

        function val = MyStd(data)
            val = std(data);
        end
    end

end

메소드가 정적이므로 클래스를 설치하지 않아도됩니다. 다음과 같이 함수를 호출합니다.

data = 1:10;

mean = Statistics.MyMean(data);
std = Statistics.MyStd(data);     


답변

Octave를 사용하여 하나의 .m 파일에 여러 함수를 정의한 다음 해당 파일의 함수를 사용해야하는 .m 파일 내에서 명령을 사용합니다.

source("mycode.m");

이것이 Matlab과 함께 사용할 수 있는지 확실하지 않습니다.

octave:8> help source
'source' is a built-in function

 -- Built-in Function:  source (FILE)
     Parse and execute the contents of FILE.  This is equivalent to
     executing commands from a script file, but without requiring the
     file to be named `FILE.m'.


답변

다음과 같은 기본 기능과 함께 하나의 기본 파일로 기능을 그룹화 할 수도 있습니다.

function [varargout] = main( subfun, varargin )
[varargout{1:nargout}] = feval( subfun, varargin{:} );

% paste your subfunctions below ....
function str=subfun1
str='hello'

그런 다음 subfun1 을 호출 하면 다음과 같습니다. str = main ( ‘subfun1’)