2011-02-04 3 views
30

미니 예 :varargin과 varargout을 사용하여 함수를 감싸는 방법?

function varargout = wrapper(varargin) 
varargout = someFunction(varargin); 

그게 내가 먼저 할 거라고 방법입니다. 그러나 예를 들어 someFunction = ndgrid이면 셀 배열 오류에 대해 정의되지 않은 값이 반환되므로 다음 시도는 someFunction(varargin{:})을 대신 사용합니다. 성공적으로 호출했지만 [a,b] = wrapper([1,2], [3,4])을 호출해도 ndgrid에 대한 직접 호출과 동일한 결과가 나오지 않으므로 잘못되었습니다. 출력 인수의 수는 입력 인수의 수와 동일한 경우

답변

35

사실, 미하일의 대답은 옳지 않습니다. someFunction이 아무 것도 요청되지 않아도 값을 반환하는 함수 인 경우, 함수가 값을 an에 할당해야 함을 나타내는 방식 인 경우 Mikhail의 래퍼가 실패합니다. SomeFunction을 죄로 대체하고 직접 죄를 실행 대 래퍼를 실행 비교 예를 들어, 당신은 볼 것 :

>> wrapper(0) 
>> sin(0) 

ans = 

    0 

이 작업을 수행하는 올바른 방법이 작동하는 이유는

function varargout = wrapper(varargin) 
[varargout{1:nargout}] = someFunction(varargin{:}); 

입니다 적어도 R2006a (아마도 더 긴) 이후이 사건에 대해 정확히 존재해온 MATLAB 인덱싱 규칙에서 알려진 약간의 엣지 경우 때문입니다. 그것은 MATLAB 인덱싱에서 사마귀가되었지만 이런 종류의 문제를 처리하는 데 필요하다고 생각되었습니다.

규칙은 :

하는 경우, 첨자 할당을 수행 할 때

  • -첨자 할당 초기화 된 변수, AND
  • 초기화 된 변수 곱슬 중괄호 인덱스이고,
  • 중괄호 안의 색인은 비어 있고
  • 왼쪽은 대괄호 안에 표시되고
  • 오른쪽은 값으로 분해/출력을 반환합니다.

그런 다음 초기화되지 않은 변수에는 오른쪽에서 반환 된 값이 들어있는 스칼라 셀이 할당됩니다. 예를 들어

:

>> clear uninit % just to make sure uninit is uninitialized 
>> [uninit{[]}] = sin(0) 

uninit = 

    [0] 
+1

+1이 깊은 통찰력에 감사드립니다! 위의 규칙을 어디서 얻었습니까? – Mikhail

+7

솔직히 말해서, 소스 코드에 액세스 할 수 있다면 도움이됩니다 ... The MathWorks에서 일합니다. 이것이 공식적으로 어디서나 문서화되어 있는지 확실하지 않습니다. 고급 사용자를 돕지 만 초보자를 완전히 혼동시킬 수있는 것들 중 하나입니다. 그러나이 경우를 처리해야하기 때문에이 동작이 변경되지 않을 것이라고 확신합니다. – SCFrench

+0

공유 해 주셔서 감사합니다. 오랫동안 저를 괴롭혔습니다. – Erik

6
function varargout = wrapper(varargin) 

if ~nargout 
    someFunction(varargin{:}); 
else 
    [varargout{1:nargout}] = someFunction(varargin{:}); 
end 
+0

오, 당신은 30 초에 의해 그것에 나를 이길 :) 나는 정확히 같은 대답을했다. – Edric

1

, 당신은

function varargout = wrapper(varargin) 
[varargout{1:nargin}] = someFunction(varargin{:}); 

사용할 수있는이 ndgrid와 함께 잘 작동합니다.

+2

오타 (분명히 varargout {1 : nargout})를 제외하고이 접근법은 항상 결과를 반환하므로주의하십시오. 따라서 Mikhail의 추가 "~ nargout"가드입니다. – Edric

+0

@ Edric : 'nargin'을 사용하는 것은 'nargout = nargin'이라는 가정 때문에 의도적으로 사용했다고 생각합니다. 이 경우'~ nargout' 가드가 필요하지 않습니다. –

+1

@ Edric ... [SCFrench의 답변] (http://stackoverflow.com/questions/4895556/how-to-wrap-a-function-using- varargin-and-varargout/4910926 # 4910926) 가드가 실제로 원하는 동작을 수행하지 않는 이유는 무엇입니까? –

관련 문제