annotate sequences/+seq/buffer.m @ 3:3f77126f7b5f

First major revision of sequence library, now using classdef form, STILL A BIT BROKEN!
author samer
date Wed, 09 Jan 2013 22:22:21 +0000
parents
children b1280319413e
rev   line source
samer@3 1 % buffer - collect elements of sequence into sequence of arrays
samer@3 2 %
samer@3 3 % buffer ::
samer@3 4 % seq([Size:[[1,E]]]) ~'sequence of E dimensional arrays',
samer@3 5 % L:natural ~'buffer width',
samer@3 6 % E:natural ~'effective dimension of input values',
samer@3 7 % buffer_tailfn ~'function to deal with last incomplete buffer'
samer@3 8 % -> seq([[Size,L]]) ~'buffered sequence (no-overlapping)'.
samer@3 9 %
samer@3 10 % buffer_tailfn can be
samer@3 11 % seq.buffer.truncate :: void -> tailfn ~'discard incomplete buffer'.
samer@3 12 % seq.buffer.append :: void -> tailfn ~'append smaller buffer to sequence'.
samer@3 13 % seq.buffer.pad :: [[N]]-> tailfn ~'pad final buffer with value'.
samer@3 14
samer@3 15 classdef buffer < seq
samer@3 16 properties (GetAccess=private, SetAccess=immutable)
samer@3 17 width
samer@3 18 colons
samer@3 19 tailfn
samer@3 20 end
samer@3 21 properties (GetAccess=private, SetAccess=private)
samer@3 22 source
samer@3 23 buf
samer@3 24 end
samer@3 25 methods
samer@3 26 function a=buffer(source,L,dim,tailfn)
samer@3 27 sz=size1(source);
samer@3 28 if nargin<3, dim=length(sz); end
samer@3 29 if nargin<4, tailfn=seq.buffer.truncate; end
samer@3 30 colons = repmat({':'},1,dim);
samer@3 31 buf=repmat(head(source),tosize([ones(size(colons)),L]));
samer@3 32 source=next(source);
samer@3 33 for i=2:L
samer@3 34 if isempty(source), a=tailfn(buf,i-1,colons); return; end
samer@3 35 buf(colons{:},i)=head(source);
samer@3 36 source=next(source);
samer@3 37 end
samer@3 38 a.source = source;
samer@3 39 a.width = L;
samer@3 40 a.colons=colons;
samer@3 41 a.tailfn = tailfn;
samer@3 42 a.buf=buf;
samer@3 43 end
samer@3 44
samer@3 45 function z=elsize(a), z=size(a.buf); end
samer@3 46 function s=tostring(a), s=sprintf('%s >> buffer(%d,%d)',tostring(a.source),a.width,length(a.colons)+1); end
samer@3 47 function x=head(a), x=a.buf; end
samer@3 48 function a=next(a)
samer@3 49 % read next lot of values and make an array
samer@3 50 for i=1:a.width
samer@3 51 if isempty(a.source), a=a.tailfn(a.buf,i-1,a.colons); return; end
samer@3 52 a.buf(a.colons{:},i)=head(a.source);
samer@3 53 a.source=next(a.source);
samer@3 54 end
samer@3 55 end
samer@3 56 end
samer@3 57
samer@3 58 methods (Static)
samer@3 59 function f=truncate, f=@(buf,i,colons)[]; end
samer@3 60 function f=append, f=@(buf,i,colons)singleton(buf(colons{:},1:i)); end
samer@3 61 function f=pad(x), f=@padfn;
samer@3 62 function s=padfn(buf,i,colons)
samer@3 63 L=size(buf,length(colons)+1);
samer@3 64 buf(colons{:},i+1:L)=repmat(x,tosize([ones(size(colons)),L-i]));
samer@3 65 s=singleton(buf);
samer@3 66 end
samer@3 67 end
samer@3 68 end
samer@3 69 end
samer@3 70