[matlab] MATLAB 함수의 일부 반환 값을 우아하게 무시하는 방법은 무엇입니까?

모든 n-1반환 값에 대해 더미 변수를 만들 필요없이 함수에서 ‘n 번째’반환 값을 가져올 수 있습니까?

MATLAB에 다음과 같은 기능이 있다고 가정 해 보겠습니다.

function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;

이제 세 번째 반환 값 에만 관심이 있다고 가정 합니다. 이는 하나의 더미 변수를 생성하여 수행 할 수 있습니다.

[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;

그러나 나는 이것이 다소 추한 것이라고 생각한다 . 다음 중 하나와 같은 작업을 할 수 있다고 생각하지만 할 수는 없습니다.

[_, _, variableThatIWillUse, _] = func;

[, , variableThatIWillUse, ] = func;

variableThatIWillUse = func(3);

variableThatIWillUse = func()(3);

작동 하는 우아한 방법이 있습니까?


지금까지 가장 좋은 해결책은 단순히를 variableThatIWillUse더미 변수로 사용하는 것입니다. 이렇게하면 작업 공간을 오염시키는 실제 더미 변수를 만들지 않아도됩니다 (또는 정리해야 함). 요컨대, 해결책은 variableThatIWillUse흥미로운 값까지 모든 반환 값에 대해 사용하는 것입니다. 이후의 반환 값은 간단히 무시할 수 있습니다.

[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;

나는 여전히 이것이 매우 추악한 코드라고 생각하지만 더 좋은 방법이 없다면 대답을 받아 들일 것입니다.



답변

이것은 다소 해킹이지만 작동합니다.

먼저 간단한 예제 함수 :

Func3 = @() deal(1,2,3);
[a,b,c]=Func3();
% yields a=1, b=2, c=3

이제 여기서 핵심은 다중 표현식 할당의 왼쪽에서 변수를 두 번 사용 하면 이전 할당이 이후 할당으로 인해 방해를 받는다는 것입니다.

[b,b,c]=Func3();
% yields b=2, c=3

[c,c,c]=Func3();
% yields c=3

(편집 : 확인하기 위해, 나는 [mu,mu,mu]=polyfit(x,y,n)당신이 관심있는 모든 polyfit것이 세 번째 인수 인 경우이 기술이 작동하는지 확인했습니다 )


편집 : 더 나은 접근 방식이 있습니다. 대신 ManWithSleeve의 답변을 참조하십시오 .


답변

MATLAB 버전 7.9 (R2009b)에서는 ~를 사용할 수 있습니다.

[~, ~, variableThatIWillUse] = myFunction();

(가) 있습니다 ,선택 사항이 아니다. 입력 [~ ~ var]만으로는 작동하지 않으며 오류가 발생합니다.

자세한 내용은 릴리스 정보 를 참조하십시오.


답변

변수가 비트 버킷에 들어가도록 남겨 두는 스타일을 사용하려는 경우 합리적인 대안은 다음과 같습니다.

[ans,ans,variableThatIWillUse] = myfun(inputs);

ans는 물론 matlab의 기본 정크 변수이며 세션 과정에서 자주 덮어 쓰입니다.

이제 MATLAB이 허용하는 새로운 트릭을 좋아하지만 ~를 사용하여 무시 된 반환 변수를 지정하지만 이전 버전의 사용자가 코드를 사용할 수 없다는 점에서 이전 버전과의 호환성 문제입니다. 나는 일반적으로 최소한 몇 개의 MATLAB 릴리스가 발행 될 때까지 이와 같은 새로운 것을 사용하지 않기 때문에 사용자가 매우 적을 것입니다. 예를 들어, 지금도 사람들은 익명 함수를 사용할 수 없을만큼 충분히 오래된 MATLAB 릴리스를 사용하고 있습니다.


답변

사용할 수있는 또 다른 옵션이 있습니다. 먼저 모든 출력을 캡처하는 셀형 배열을 만듭니다 ( NARGOUT 함수를 사용하여 주어진 함수가 반환하는 출력 수를 결정할 수 있음).

a = cell(1,3);  % For capturing 3 outputs
% OR...
a = cell(1,nargout(@func));  % For capturing all outputs from "func"

그런 다음 다음과 같이 함수를 호출합니다.

[a{:}] = func();

그리고 단순히에서 요소를 제거 당신이 원하는 것을하고 덮어 :

a = a{3};  % Get the third output


답변

kth out 함수를 작성했습니다.


function kth = kthout(k,ffnc,varargin)
%% kthout: take the kth varargout from a func call %FOLDUP
% 
% kth = kthout(k,ffnc,varargin)
%
% input:
%  k                      which varargout to get
%  ffnc                   function to call;
%  varargin               passed to ffnc;
% output:
%  kth                    the kth argout;
% global:
% nb: 
% See also:
% todo:
% changelog: 
%
%% %UNFOLD

[outargs{1:k}]  = feval(ffnc,varargin{:});
kth                         = outargs{k};

end %function

그런 다음 전화 할 수 있습니다

val_i_want  = kthout(3,@myfunc,func_input_1,func_input_2); %etc

다음과 같이 함수를 마무리 할 수도 있습니다.

func_i_want = @(varargin)(kthout(3,@myfunc,varargin{:}));  %assuming you want the 3rd output.

그 후에 사용

val_i_want = func_i_want(func_input_1,func_input_2);

이와 같은 익명 함수를 사용하는 것과 관련된 오버 헤드가 있으며 이것은 수천 번 호출되는 코드에서 수행 할 작업이 아닙니다.


답변

Matlab 2010a에서 저는 당신이 요구하는 것을 깔끔하게하는 방법을 찾았습니다. 단순히 따옴표없이 문자 “~”를 더미 변수 (여러 매개 변수를 반환 할 때 원하는만큼)로 사용하는 것입니다. 이는 함수가 누락 된 데이터를 처리하도록 설계된 경우 함수에 대한 입력 매개 변수에도 적용됩니다. 이것이 이전 버전에 존재했는지는 모르겠지만 최근에 발견했습니다.


답변

선택한 출력 만 반환하는 함수 (또는 익명 함수)를 만들 수 있습니다.

select = @(a,b) a(b);

그런 다음 다음과 같이 함수를 호출 할 수 있습니다.

select(func,2);
select(func,1:3);

또는 출력을 변수에 할당 할 수 있습니다.

output(1,2:4) = select(func,1:3);