1 |
% EXTRACT - Extract a section from an input vector which contains an |
2 |
% n-dimensional array in a linear series. |
3 |
% Usage: out = Extract( InputVector, section ) |
4 |
% InputVector is of form |
5 |
% [ NumberDimensions Dim1 Dim2 ... DimN data ] |
6 |
% section is of form |
7 |
% [ Dim1Min Dim1Max Dim2Min Dim2Max ... DimNMin DimNMax ] |
8 |
% |
9 |
function outArr = Extract( inArr, subSection ) |
10 |
if nargin ~= 2 |
11 |
fprintf(2,'**ERROR** wrong number of arguments.\n') |
12 |
fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') |
13 |
return |
14 |
end |
15 |
if size(subSection,1) ~= 1 |
16 |
fprintf(2,'**ERROR** sub-section incorrectly specified.\n') |
17 |
fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') |
18 |
return |
19 |
end |
20 |
if inArr(1)*2 ~= size(subSection,2) |
21 |
fprintf(2,'**ERROR** sub-section has wrong number of elments.\n') |
22 |
fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') |
23 |
return |
24 |
end |
25 |
% |
26 |
% Get dimensions of data array help in input vector. |
27 |
nD=inArr(1); |
28 |
Ds=inArr(2:nD+1); |
29 |
for i=1:nD |
30 |
s1(i)=subSection((i-1)*2+1); s2(i)=subSection((i-1)*2+2); |
31 |
end |
32 |
inStep(1)=1; |
33 |
for i=2:nD |
34 |
inStep(i)=inStep(i-1)*Ds(i-1); |
35 |
end |
36 |
nC=1; |
37 |
for i =1:nD |
38 |
nC=nC*(subSection((i-1)*2+2)-subSection((i-1)*2+1)+1); |
39 |
end |
40 |
wk=zeros(nC,nD); |
41 |
% |
42 |
% Build list of coordinates to extract. |
43 |
for i=1:nD |
44 |
ss=subSection((i-1)*2+1); se=subSection((i-1)*2+2); |
45 |
if i == 1 lCycle = 1; |
46 |
else lCycle = prod((s2(1:i-1)-s1(1:i-1)+1)); |
47 |
end |
48 |
if i < nD nRep = prod((s2(i+1:nD)-s1(i+1:nD)+1)); |
49 |
else nRep = 1; |
50 |
end |
51 |
blk=reshape(([ss:se]'*(zeros(1,lCycle)+1))',lCycle*(se-ss+1),1); |
52 |
wk(:,i)=reshape(blk*(zeros(1,nRep)+1),nRep*lCycle*(se-ss+1),1); |
53 |
end |
54 |
% |
55 |
% Translate coordinate list into offsets along vector. |
56 |
iS=[0,inStep(2:nD)]; |
57 |
wk(:,1)=1+nD+wk(:,1)+(wk-1)*iS'; |
58 |
% |
59 |
% Extract selected locations. |
60 |
outArr=inArr(wk(:,1)'); |
61 |
return |