samer@38: function [g,s,l,seq]=table(f,varargin) samer@38: opts=options('nargin',nargin(f),'nargout',nargout(f),'file',[],varargin{:}); samer@38: nin=opts.nargin; samer@38: nout=opts.nargout; samer@38: samer@38: Table=cell(0,nin+nout); samer@38: samer@38: g=@lookup; samer@38: s=@saver; samer@38: l=@loader; samer@38: seq=@getrows; samer@38: samer@38: function s=getrows, s=slices(Table,1); end samer@38: function saver(file), samer@38: if nargin<1, file=opts.file; end samer@38: fprintf('saving %d tabled rows of %s to %s\n',size(Table,1),tostring(f),file); samer@38: d.table=Table; samer@38: save(file,'-struct','d'); samer@38: end samer@38: function loader(file), samer@38: if nargin<1, file=opts.file; end samer@38: d=load(file); samer@38: Table=d.table; samer@38: fprintf('loading %d tabled rows of %s from %s\n',size(Table,1),tostring(f),file); samer@38: end samer@38: samer@38: function varargout=lookup(varargin) samer@38: matches=select(@(r)isequal(varargin,r(1:nin)),slices(Table,1)); samer@38: if isempty(matches) samer@38: [varargout{1:nout}]=f(varargin{:}); samer@38: Table=vertcat(Table,[varargin,varargout]); samer@38: else samer@38: varargout=col(head(matches),nin+(1:nout)); samer@38: end samer@38: end samer@38: end samer@38: samer@38: samer@38: