function out=catdim(dims,a)
% CATDIM Unconcatenate array and catenate along other dimension.
% OUT=CATDIM(DIMS,A)
% with DIMS=[da1,da2;db1,db2;..] an array of size [n,2].
% Unconcatenates array A along dimension da1 and concatenates along da2,
% then db1 and so on.
% At the end squeezes result to remove singelton dimensions.
% Useful to reshape a multidimensional array to display it e.g. with imagesc.
%
% Examples:
%
% a=[1,2,3;4,5,6]; a=cat(3,a,a+10)
% a(:,:,1) =
% 1 2 3
% 4 5 6
% a(:,:,2) =
% 11 12 13
% 14 15 16
%
% catdim([3,1],a)
% ans =
% 1 2 3
% 4 5 6
% 11 12 13
% 14 15 16
% catdim([3,2],a)
% ans =
% 1 2 3 11 12 13
% 4 5 6 14 15 16
%
% b=[1,2;,3,4]
% b =
% 1 2
% 3 4
% catdim([1,2],b)
% ans =
% 1 2 3 4
%
% c=cat(4,a,a+20)
% c(:,:,1,1) =
% 1 2 3
% 4 5 6
% c(:,:,2,1) =
% 11 12 13
% 14 15 16
% c(:,:,1,2) =
% 21 22 23
% 24 25 26
% c(:,:,2,2) =
% 31 32 33
% 34 35 36
%
% catdim([3,2;4,1],c)
% ans =
% 1 2 3 11 12 13
% 4 5 6 14 15 16
% 21 22 23 31 32 33
% 24 25 26 34 35 36
%
% See also CAT, DEAL, NUM2CELL, MAT2CELL, CELL2MAT, RESHAPE
%
% Code is heavily based on D.C. Hanselman's UNCAT
%
% Andreas Hoechner, GFZ Potsdam
% 20.8.2007
if nargin~=2
error('uncat:IncorrectInputArguments','Two Input Arguments Required.')
end
if isempty(dims) || size(dims,2)~=2 || ~isequal(fix(dims),dims) || min(min(dims))<1 || max(max(dims))>ndims(a)
error('uncat:DimOutofRange','DIM Invalid.')
end
for ncd=1:size(dims,1),
d1=dims(ncd,1);
d2=dims(ncd,2);
b=cell(1,size(a,d1));
id=repmat({':'},1,ndims(a));
for k=1:size(a,d1),
id{d1}=k;
b{k}=a(id{:});
end
a=cat(d2,b{:});
end
out=squeeze(a);