IT

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

lottoking 2020. 7. 21. 07:44
반응형

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

... 여기서 핵심은 이제 multi-표현식 할당의 왼쪽에서 변수를 두 번 사용하는 경우 나중에 할당하면 이전 할당이 방해를 받는다는을 구석으로입니다.

[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에서 나는 당신이 요구하는 것을 깔끔하게 수행했습니다. characher "~"(물론 따옴표없이)를 더미 변수로 사용하는 것입니다 (복제 할 변수를 반환 할 때 원하는만큼). 함수가 누락 된 데이터를 처리하는 경우에는 함수에 대한 입력 매개 변수 작동합니다. 이것이 이전 버전에 존재는 모르겠지만 최근에 발견되었습니다.


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

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

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

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

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

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

다음과 같이 ans (n)을 사용하지 않는 이유가 있습니까?

a=rand([5 10 20 40]);

size(a);

b=ans(2);

b = 10을 제공하고 이렇게하면 모든 Matlab 버전과 호환되지 않습니까?

또한 이것은 얼마나 많은 인수가 있을지 모를 때 두 번째 출력 인수를 얻기 위해 작동합니다! 반면에 이렇게하면 :

[~, b] = size(a);

그러면 b = 8000! (더 많은 인수를 잡으려면 ~로 끝나야합니다!)

참고 URL : https://stackoverflow.com/questions/747296/how-to-elegantly-ignore-some-return-values-of-a-matlab-function

반응형