% EXTRACT - Extract a section from an input vector which contains an % n-dimensional array in a linear series. % Usage: out = Extract( InputVector, section ) % InputVector is of form % [ NumberDimensions Dim1 Dim2 ... DimN data ] % section is of form % [ Dim1Min Dim1Max Dim2Min Dim2Max ... DimNMin DimNMax ] % function outArr = Extract( inArr, subSection ) if nargin ~= 2 fprintf(2,'**ERROR** wrong number of arguments.\n') fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') return end if size(subSection,1) ~= 1 fprintf(2,'**ERROR** sub-section incorrectly specified.\n') fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') return end if inArr(1)*2 ~= size(subSection,2) fprintf(2,'**ERROR** sub-section has wrong number of elments.\n') fprintf(2,'Usage: a = Slice ( b, [ xmin xmax ymin ymax ... ]\n') return end % % Get dimensions of data array help in input vector. nD=inArr(1); Ds=inArr(2:nD+1); for i=1:nD s1(i)=subSection((i-1)*2+1); s2(i)=subSection((i-1)*2+2); end inStep(1)=1; for i=2:nD inStep(i)=inStep(i-1)*Ds(i-1); end nC=1; for i =1:nD nC=nC*(subSection((i-1)*2+2)-subSection((i-1)*2+1)+1); end wk=zeros(nC,nD); % % Build list of coordinates to extract. for i=1:nD ss=subSection((i-1)*2+1); se=subSection((i-1)*2+2); if i == 1 lCycle = 1; else lCycle = prod((s2(1:i-1)-s1(1:i-1)+1)); end if i < nD nRep = prod((s2(i+1:nD)-s1(i+1:nD)+1)); else nRep = 1; end blk=reshape(([ss:se]'*(zeros(1,lCycle)+1))',lCycle*(se-ss+1),1); wk(:,i)=reshape(blk*(zeros(1,nRep)+1),nRep*lCycle*(se-ss+1),1); end % % Translate coordinate list into offsets along vector. iS=[0,inStep(2:nD)]; wk(:,1)=1+nD+wk(:,1)+(wk-1)*iS'; % % Extract selected locations. outArr=inArr(wk(:,1)'); return