2011-05-12 2 views
0

가능한 중복 :
Is it possible to define more than one function per file in MATLAB?MATLAB "subfunction"을 파일 외부에서 호출 할 수있는 방법이 있습니까?

MATLAB에서 (익명되지 않음) 기능을, 당신은 함수와 같은 이름의 파일을 만들 필요가 정의하기 위해

; myfunc.m, 나는 같이, 또한 하위 기능이이 같은 파일에 가정

function rtn = myfunc(arg) 
% do some stuff 
end 

: 예를 들어, 함수 myfunc에가에 따라 파일에 myfunc.m을 정의 할 수있다라는

function rtn = myfunc(arg) 
% do some stuff 
end 

function rtn = mysubfunc(arg) 
% do some other stuff 
end 

AFAIK의 subfunc.m 파일의 외부 어디에서나 일어나는 실행에서 mysubfunc에 액세스 할 수있는 방법이 없습니다. 나는 MATLAB (R2010b)에서이 작은 특질에 짜증을 내며 계속 괴롭힘을당했습니다. 내가 틀렸어 - mysubfunc 외부에서 전화 myfunc.m?

업데이트 : 새로운 질문 : 이 있습니까?이 방법이 있습니까? 또는 나는 그것을 정말로 빨아 들이고 계속 더 많은 파일을 만들어야 하는가?

+0

아니요, 당신은 그것을 빨아 들여야합니다. 세미 네임 스페이스 방식을 사용하여이 작업을 간소화하고 내 코드를 재사용하도록 권장합니다 (예 : 프로젝트의 'heatflux'에서 hf_로 모든 함수 이름을 시작합니다). – Alex

+0

여기에 당신의 목표는 무엇입니까? 별도의 파일에서 각 기능을 사용하는 데 필요한 혼란을 줄이고 싶습니까? –

+0

myfunc 외부에서 subfunc에 액세스해야하는 경우 거의 정의에 따라 subfunction이 아니어야합니다.서브 함수는 둘러싸는 함수의 컨텍스트에서만 관련이있는 공통 기능을 위해 예약되어야합니다. – Marc

답변

9

유틸리티 클래스에서 모든 정적 메서드를 만들 수 있습니다. 함수는 이름으로 전역 참조 할 수 있지만 하나의 M 파일 만 관리하면됩니다.

classdef mystuff % in mystuff.m 
    %MYSTUFF Utility functions for something or other... 
    methods (Static = true) 
     function rtn = myfunc(arg) 
     disp('myfunc'); 
     end 

     function rtn = mysubfunc(arg) 
     disp('mysubfunc'); 
     end 
    end 
end 

단점으로는 mystuff.myfunc()와 같은 모든 참조를 정규화하거나 가져와야합니다. "import mystuff. *"는 클래스 외부의 코드에서 이것을 처리 할 수 ​​있습니다.

import mystuff.* 
myfunc() 
mysubfunc() 

클래스 내에서 함수 사이의 호출을 정규화해야합니다. (Matlab의 MCOS 구문 인 IMHO에서 큰 문제가 있습니다.) 또한 일반 함수보다 호출 오버 헤드가 많으므로 긴밀한 루프에서 코드를 호출하는 경우 코드가 느려집니다. 위쪽면에, 이제 그들은 클래스 멤버이며, 리팩터링하여 클래스 클래스와 함수 등을 사용할 수 있습니다.

코드베이스를 구성하려면 이름이 "+"로 시작하는 디렉토리에 코드 공간을 두어 이름 공간에 지정할 수 있습니다. 같은 수의 파일이지만 적어도 당신의 dir에 대한 구조가 있습니다.

+0

앤드류 감사합니다.이 솔루션은 깨끗한 것처럼 보입니다. – pariser

1

함수 핸들을 통해 액세스. OO 에뮬레이션 (정적 메서드)으로 볼 수 있습니다. 이 당신이 비록이 기술을 사용하지 않는 것이 좋습니다.

function obj = mainFunc() 
obj.myFunc = @myFunc; 
obj.mySubFunc = @mySubFunc; 
end 

function rtn = myFunc(arg) 
% do some stuff 
end 

function rtn = mySubFunc(arg) 
% do some other stuff 
end 
+1

"Object Emulation"은 아마 나쁜 생각 일 것입니다. 하지만 일반적으로 함수 핸들을 서브 함수로 반환하는 것은 MATLAB에서 수행하기에 충분히 합리적인 작업이라고 생각합니다. – Edric

+0

이 문제를 해결하려면 위의 Andrew가 말한 유틸리티 클래스를 만듭니다. – Marc

관련 문제