58 lines
1.2 KiB
Matlab
58 lines
1.2 KiB
Matlab
function b = catuneven(dim, padval, varargin)
|
|
%CATUNEVEN Concatenate unequally-sized arrays, padding with a value
|
|
%
|
|
% This function is similar to cat, except it does not require the arrays to
|
|
% be equally-sized along non-concatenated dimensions. Instead, all arrays
|
|
% are padded to be equally-sized using the value specified.
|
|
%
|
|
% b = catuneven(dim, padval, a1, a2, ...)
|
|
%
|
|
% Input variables:
|
|
%
|
|
% dim: dimension along which to concatenate
|
|
%
|
|
% padval: value used as placeholder when arrays are expanded
|
|
%
|
|
% a#: arrays to be concatenated, numerical
|
|
%
|
|
% Output variables:
|
|
%
|
|
% b: concatenated array
|
|
|
|
% Copyright 2013 Kelly Kearney
|
|
|
|
ndim = max(cellfun(@ndims, varargin));
|
|
ndim = max(ndim, dim);
|
|
|
|
for ii = 1:ndim
|
|
sz(:,ii) = cellfun(@(x) size(x, ii), varargin);
|
|
end
|
|
maxsz = max(sz, [], 1);
|
|
|
|
nv = length(varargin);
|
|
val = cell(size(varargin));
|
|
for ii = 1:nv
|
|
sztmp = maxsz;
|
|
sztmp(dim) = sz(ii,dim);
|
|
|
|
idx = cell(ndim,1);
|
|
[idx{:}] = ind2sub(sz(ii,:), 1:numel(varargin{ii}));
|
|
|
|
idxnew = sub2ind(sztmp, idx{:});
|
|
|
|
try
|
|
val{ii} = ones(sztmp) * padval;
|
|
catch
|
|
val{ii} = repmat(padval, sztmp);
|
|
end
|
|
val{ii}(idxnew) = varargin{ii};
|
|
|
|
end
|
|
|
|
b = cat(dim, val{:});
|
|
|
|
|
|
|
|
|
|
|