2016-12-02 6 views
4

여기 상황이있다 : 나는 함수가 상수 입력 길이 (즉 nargin(fun)>=0이다)이다 fun을 처리받는 함수를 만들 필요가 , 입력에 약간의 변형을 수행하고 그런 다음 fun으로 전화하십시오. 의사 코드 :입력 인수의 주어진 수의 함수를 만듭니다

지금 문제
function g = transformFun(fun) 
n = nargin(fun); 
g = @(v_1, ..., v_n) ... 
%   ^NOT REAL MATLAB - THE MAIN PROBLEM 
    fun(someCalculationsWithSameSizeOfOutput(v_1,...v_n){:}); 
% CAN BE ACHIEVED WITH TEMPORARY CELL IN HELPER FUNCTION^
end 

: 출력 기능의 핸들 (g = transformFun(concreteFun)는) 다음 함수가 일정한 길이라는 사실에 의존하는 다른 코드로 전달된다 (nargin(g)>=0를 가정), 따라서 가변 input-length 함수는 받아 들일 수 없다 ("쉬운"해결책).

이 변환은 모든 가능한 인수 (n은 무제한 임)와 함께 많은 함수와 함께 호출되기 때문에 가능한 많은 가능성을 다루는 것도 불가능합니다.

달성하기위한 간단한 방법이 있습니까?

[인터넷을 몇 시간 동안 검색했지만 더 이상 사용되지 않는 inline 기능과 관련된 불쾌한 해킹이 발생할 수 있습니다. 어쩌면 나는 틀린 용어가있다.]

+0

'g '는'nargin'으로 질의 할 수 있어야합니까? – Suever

+1

당신의 말씨가 문제를 더욱 복잡하게 만들고 있다고 생각합니다. 당신은'재미'가 ** 변수 ** 입력 양을 처리 할 수 ​​있도록하고 ** 상수 **는 사용할 수 없길 원합니다, 맞습니까? –

+0

@Suever 맞아요. –

답변

4

그래서 일반적으로는 이런 종류의 물건을 처리 할 수 ​​varargin를 사용할 수 있지만 당신은 입력의 실제 수를 반환하는 nargin(g)을 필요로하기 때문에 그것은 조금 복잡합니다.

str2func을 사용하여 익명 함수를 문자열로 만든 다음 함수 핸들로 변환 할 수 있습니다.

% Create a list or arguments: x1, x2, x3, x4, ... 
args = sprintf('x%d,', 1:nargin(func)); 
args(end) = ''; 

% Place these arguments into a string which indicates the function call 
str = sprintf('@(%s)fun(someCalculationsWithSameSizeOfOutput(%s))', args, args); 

% Now create an anonymous function from this string 
g = str2func(str); 

위의 강조 표시에 따라 기능 핸들을 다룰 수있는 다른 방법을 고려해 볼 가치가 있습니다.

+0

Brilliant! 고맙습니다! –

+0

다른 사람들의 코드와 통신하기 때문에 조금 까다 롭지 만 더 동의 할 수는 없습니다. –