여러 결과를 생성해야하지만 한 번에 하나씩, 한 번에 모든 배열을 반복하지 않아도됩니다.파이썬에서 yield 키워드에 해당하는 MATLAB은 무엇입니까?
파이썬처럼 생성기와 같은 생성기로 어떻게 Matlab에서이를 수행 할 수 있습니까?
여러 결과를 생성해야하지만 한 번에 하나씩, 한 번에 모든 배열을 반복하지 않아도됩니다.파이썬에서 yield 키워드에 해당하는 MATLAB은 무엇입니까?
파이썬처럼 생성기와 같은 생성기로 어떻게 Matlab에서이를 수행 할 수 있습니까?
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
변수 나 클로저를 사용하여 함수 대신 함수를 사용하여 비슷한 함수를 작성하고 함수의 로컬 상태를 저장하고 호출 할 때마다 "중간 결과"를 반환 할 수 있습니다. (? 아직 옥타브)
, 당신은 (중첩 기능 범위) 폐쇄를 사용할 수 있습니다
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(); % ...
를 내가 matlab에 게으른 평가를 가지고 있다고 생각하지 않습니다. – senshin
varargout을 보시면 문제가 해결 될 것입니다. – Daniel
메모리가 부족하면 varargout으로 문제를 해결할 수 없습니다. –