2010-03-19 3 views
5

varargin을 입력으로 사용하는 함수에 래퍼를 씁니다. 래퍼에서 함수 서명을 유지하려고하지만중첩을하면 모든 변수가 함께 정리됩니다. 나는 개별 변수의 목록을 가질 수 있도록가변 변수 개별 변수에 풀기

function inner(varargin) %#ok<VANUS> 
% An existing function 
disp(nargin) 
end 

function outer(varargin) 
% My wrapper 
inner(varargin); 
end 

outer('foo', 1:3, {}) % Uh-oh, this is 1 

나는, 외부 기능에 varargin 압축을 풀 수있는 방법이 필요합니다. inner을 전달하고 변수 eval을 호출하는 변수 이름의 문자열을 구성하여이 작업을 수행하는 것은 실제로 불쾌한 방법입니다.

function outer2(varargin) %#ok<VANUS> 
% My wrapper, second attempt 
inputstr = ''; 
for i = 1:nargin 
    inputstr = [inputstr 'varargin{' num2str(i) '}']; %#ok<AGROW> 
    if i < nargin 
     inputstr = [inputstr ', ']; %#ok<AGROW> 
    end 
end  
eval(['inner(' inputstr ')']); 
end 

outer2('foo', 1:3, {}) % 3, as it should be 

누구나 덜 끔찍한 일을 생각할 수 있습니까?

답변

10

외측에서 내측의 전화 대신에, 다른 말로

inner(varargin{:}) 

될 내부 호출에 대한 콤마 분리 된리스트로 varargin을 확장한다. 그렇다면 모든 혼란을 피할 수 있습니다.

+0

감사합니다. 매우 우아합니다. –

+0

호기심 때문에 배열을 분할하는 것과 동일한 방법이 있습니까? 더 멋진 버전의'c = arrayfun (@ (x) x, 1 : 3, 'UniformOutput', false); c {:}'. –

+0

잘 모르겠지만 아마도 cell2mat의 변종을 사용할 수 있습니다. arrayfun과 관련된 문제는 무엇입니까? 출력을 미리 할당하면 for 루프를 사용할 수도 있습니다. 합리적인 크기의 어레이에서 성능이 큰 문제는 아니라고 생각합니다. – Loren

관련 문제