samer@3
|
1 function [Y,X0]=gathern(dim,n,X,varargin)
|
samer@3
|
2 % gathern - make big array of n arrays in a sequence
|
samer@3
|
3 %
|
samer@3
|
4 % gathern :: N:natural, seq [D] -> [E], seq [D].
|
samer@3
|
5 % gathern ::
|
samer@3
|
6 % D:natural ~'the dimension along which to collect arrays',
|
samer@3
|
7 % N:natural ~'number of elements to collect',
|
samer@3
|
8 % seq [D] ~'the seq to gather',
|
samer@3
|
9 % options {
|
samer@3
|
10 % draw :: boolean /0 ~'whether or not to call plotfn every iteration';
|
samer@3
|
11 % plotfn :: seq [D]->handle ~'plotting function';
|
samer@3
|
12 % save :: natural /0 ~'if >0, then save state every this many interations';
|
samer@3
|
13 % recover:: boolean / 0 ~'if 1, then attempt to restart from saved state';
|
samer@3
|
14 % id :: string /'@gather' ~'file to save state'
|
samer@3
|
15 % }
|
samer@3
|
16 % -> [E], seq [D].
|
samer@3
|
17 %
|
samer@3
|
18 % E is such that E(I) = D(I) if I~=N. The second return
|
samer@3
|
19 % is the final object in the sequence
|
samer@3
|
20
|
samer@3
|
21 Y=[]; i=1;
|
samer@3
|
22 if nargin<3 % simple version
|
samer@3
|
23 if ~isempty(X),
|
samer@3
|
24 Y=head(X);
|
samer@3
|
25 i=1; while i<n
|
samer@3
|
26 X0=X; X=next(X0); i=i+1;
|
samer@3
|
27 if isempty(X), break; end
|
samer@3
|
28 Y=cat(dim,Y,head(X));
|
samer@3
|
29 end
|
samer@3
|
30 end
|
samer@3
|
31 else
|
samer@37
|
32 opts=options('save',0,'recover',0,'draw',0,'plotfn',@nullplot,varargin{:});
|
samer@3
|
33 draw=opts.draw;
|
samer@3
|
34 savn=opts.save;
|
samer@3
|
35
|
samer@3
|
36 if opts.recover && exist([opts.id,'.mat'],'file')
|
samer@3
|
37 load(opts.id);
|
samer@3
|
38 X=next(X0);
|
samer@3
|
39 fprintf('recovering from i=%d\n',i);
|
samer@3
|
40 end
|
samer@3
|
41
|
samer@3
|
42 if savn==0 && ~draw
|
samer@3
|
43 if ~isempty(X)
|
samer@3
|
44 Y=head(X);
|
samer@3
|
45 i=1; while i<n
|
samer@3
|
46 X0=X; X=next(X0); i=i+1;
|
samer@3
|
47 if isempty(X), break; end
|
samer@3
|
48 Y=cat(dim,Y,head(X));
|
samer@3
|
49 end
|
samer@3
|
50 end
|
samer@3
|
51 else
|
samer@3
|
52 if savn>0
|
samer@3
|
53 fprintf('Will save every %d iterations to %s.mat\n',savn,opts.id);
|
samer@3
|
54 end
|
samer@3
|
55
|
samer@3
|
56 if ~isempty(X)
|
samer@3
|
57 Y=head(X);
|
samer@3
|
58 i=1; while i<n
|
samer@3
|
59 X0=X; X=next(X0); i=i+1;
|
samer@3
|
60 if draw, opts.plotfn(X0); end
|
samer@3
|
61 if mod(i,savn)==0,
|
samer@3
|
62 fprintf('saving at %d.\n',i);
|
samer@3
|
63 save(opts.id,'X0','Y','opts','i','dim');
|
samer@3
|
64 end
|
samer@3
|
65 optpause(opts);
|
samer@3
|
66 if isempty(X), break; end
|
samer@3
|
67 Y=cat(dim,Y,head(X));
|
samer@3
|
68 end
|
samer@3
|
69 end
|
samer@3
|
70 if savn>0, delete([opts.id '.mat']); end
|
samer@3
|
71 end
|
samer@3
|
72 if nargout>1, if isempty(X), X0=X; else X0=next(X); end; end
|
samer@3
|
73 end
|
samer@3
|
74
|
samer@3
|
75 function nullplot(A,B), return
|