forked from kilianv/CoastSat_WRL
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
Matlab
88 lines
2.0 KiB
Matlab
7 years ago
|
function out = sort_back( data, ind, dim )
|
||
|
% SORT_BACK sort back data to original order
|
||
|
% ind is the indexes obtained from sorting
|
||
|
% dim is the sorted dimension of the data (assumed to be 1 if not specified)
|
||
|
% Ex:
|
||
|
% y = randn(3,4,2);
|
||
|
% [y,ind] = sort(y,2);
|
||
|
% do stuff with sorted y...
|
||
|
% y2 = sort_back( y, ind, 2 );
|
||
|
%
|
||
|
% Works on arrays of any dimension
|
||
|
% Also works on cellstrings (vectors)
|
||
|
%
|
||
|
% C = {'hello' 'yes' 'no' 'goodbye'};
|
||
|
% [C,ind] = sort(C);
|
||
|
% C2 = sort_back(C,ind);
|
||
|
%
|
||
|
% See also SORT
|
||
|
|
||
|
%Author Ivar Eskerud Smith
|
||
|
|
||
|
if size(ind)~=size(data)
|
||
|
error('Different size of indexes and input data');
|
||
|
end
|
||
|
|
||
|
if iscell(data)
|
||
|
if ~any(size(data)==1)
|
||
|
error('Only vectors are supported in cell sorting/back-sorting');
|
||
|
end
|
||
|
out=cell(size(data));
|
||
|
out(ind) = data;
|
||
|
return;
|
||
|
end
|
||
|
|
||
|
if ~isnumeric(data) || ~isnumeric(ind)
|
||
|
error('Inputs have to be numeric or cell');
|
||
|
end
|
||
|
|
||
|
n=ndims(ind);
|
||
|
if ~exist('dim','var')
|
||
|
dim=1;
|
||
|
end
|
||
|
if dim>n
|
||
|
error('Specified sorted dimension must be within array bounds');
|
||
|
end
|
||
|
|
||
|
%shift array so that the sorted dim is the first dimension
|
||
|
if dim~=1
|
||
|
sortInd=1:1:n;sortInd(1)=dim;sortInd(dim)=1;
|
||
|
data = permute(data,sortInd);
|
||
|
ind = permute(ind,sortInd);
|
||
|
end
|
||
|
inds = repmat({1},1,n);inds{1}=':';
|
||
|
if ~issorted( data(inds{:}) )
|
||
|
warning('The input data is not sorted along the specified dimension');
|
||
|
end
|
||
|
|
||
|
s = size(ind);
|
||
|
nData = numel(data);
|
||
|
inds = repmat({1},1,n);
|
||
|
inds(1:2)={':',':'};
|
||
|
shiftSize = s(1)*s(2);
|
||
|
out=nan(size(data));
|
||
|
|
||
|
%loop all 2d arrays within nd-array
|
||
|
for k=1:prod(s(3:end))
|
||
|
tmpdata = data(inds{:});
|
||
|
tmpind = ind(inds{:});
|
||
|
|
||
|
%data is shifted so that the sorted dim = 1
|
||
|
for i=1:numel(tmpdata(1,:))
|
||
|
out(tmpind(:,i),i) = tmpdata(:,i);
|
||
|
end
|
||
|
|
||
|
if n>2
|
||
|
%shift to next 2d array within nd-array
|
||
|
shiftInds = mod((1:nData)-shiftSize-1,nData)+1;
|
||
|
out=reshape(out(shiftInds),s);
|
||
|
data=reshape(data(shiftInds),s);
|
||
|
ind=reshape(ind(shiftInds),s);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
%permute back to original order
|
||
|
sortInd=1:1:ndims(out);sortInd(1)=dim;sortInd(dim)=1;
|
||
|
out = permute(out,sortInd);
|
||
|
|