2014-01-13 3 views
5

여러 결과를 생성해야하지만 한 번에 하나씩, 한 번에 모든 배열을 반복하지 않아도됩니다.파이썬에서 yield 키워드에 해당하는 MATLAB은 무엇입니까?

파이썬처럼 생성기와 같은 생성기로 어떻게 Matlab에서이를 수행 할 수 있습니까?

+7

를 내가 matlab에 게으른 평가를 가지고 있다고 생각하지 않습니다. – senshin

+0

varargout을 보시면 문제가 해결 될 것입니다. – Daniel

+2

메모리가 부족하면 varargout으로 문제를 해결할 수 없습니다. –

답변

10

yield 키워드를 사용하는 함수를 실행할 때 실제로 생성기를 반환합니다. 생성자는 반복자 유형입니다. MATLAB은이 중 하나에 대한 구문을 제공하지 않지만 직접 "iterator interface"을 구현할 수 있습니다. 반복자에 파이썬의 구조 for .. in ..를 사용하는 경우, 내부적으로 유사한 작업을 수행

r = rangeIterator(10); 
try 
    % keep call next() method until it throws StopIteration 
    while true 
     x = r.next(); 
     disp(x); 
    end 
catch ME 
    % if it is not the "stop iteration" exception, rethrow it as an error 
    if ~strcmp(ME.identifier,'Iterator:StopIteration') 
     rethrow(ME); 
    end 
end 

참고 :

classdef rangeIterator < handle 
    properties (Access = private) 
     i 
     n 
    end 

    methods 
     function obj = rangeIterator(n) 
      obj.i = 0; 
      obj.n = n; 
     end 

     function val = next(obj) 
      if obj.i < obj.n 
       val = obj.i; 
       obj.i = obj.i + 1; 
      else 
       error('Iterator:StopIteration', 'Stop iteration') 
      end 
     end 

     function reset(obj) 
      obj.i = 0; 
     end 
    end 
end 
여기

우리는 반복자를 사용하는 방법입니다 : 여기 파이썬에서 xrange 기능과 유사한 예입니다 맡은 일.

변수 대신 persistent 변수 나 클로저를 사용하여 함수 대신 함수를 사용하여 비슷한 함수를 작성하고 함수의 로컬 상태를 저장하고 호출 할 때마다 "중간 결과"를 반환 할 수 있습니다. (? 아직 옥타브)

MATLAB에서
+0

가, 내 우는 아들에 의해 중단되었습니다. 나는 생성자에서 함수 핸들을 받아 들일 수있는 솔루션을 작성했다. 어쨌든, +1 – Jonas

+0

Iterator에서'size' ('[1, n]')과'subsref' 메쏘드를 적절히 오버로드한다면, 보통의 for .. in ... 구문을 그대로 유지할 수 있습니다. – sebastian

2

, 당신은 (중첩 기능 범위) 폐쇄를 사용할 수 있습니다

function iterator = MyTimeStampedValues(values) 

    index = 1; 

    function [value, timestamp, done] = next() 
     if index <= length(values) 
      value = values(index); 
      timestamp = datestr(now); 
      done = (index == length(values)); 
      index = index + 1; 
     else 
      error('Values exhausted'); 
     end 
    end 

    iterator = @next; 
end 

다음

iterator = MyTimeStampedValues([1 2 3 4 5]); 
[v, ts, done] = iterator(); % [1, '13-Jan-2014 23:30:45', false] 
[v, ts, done] = iterator(); % ... 
+1

이것은 MATLAB R2013b에서 잘 작동하지만'Values'는'MyTimeStampedValues'가 호출 될 때 생성됩니다. 따라서 실제로 게으른 평가는 없습니다. – Lumen

+0

@Lumen 숫자가 아니며,이 예제에서 느리게 생성되는 타임 스탬프입니다. 원칙적으로 파이썬에서의 일과 수익률은 단지 그것을위한 지름길 일뿐입니다. 그것이하는 일은 호출간에 상태를 유지하는 것을 구현하는 것입니다. – Trilarion