Added source Matlab code for reference
This commit is contained in:
parent
b8af977117
commit
b5d99903d2
186 changed files with 61405 additions and 1 deletions
120
matlab/linkage/myCell2mat.m
Normal file
120
matlab/linkage/myCell2mat.m
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
function m = myCell2mat(c)
|
||||
%CELL2MAT Convert the contents of a cell array into a single matrix.
|
||||
% M = CELL2MAT(C) converts a multidimensional cell array with contents of
|
||||
% the same data type into a single matrix. The contents of C must be able
|
||||
% to concatenate into a hyperrectangle. Moreover, for each pair of
|
||||
% neighboring cells, the dimensions of the cell's contents must match,
|
||||
% excluding the dimension in which the cells are neighbors. This constraint
|
||||
% must hold true for neighboring cells along all of the cell array's
|
||||
% dimensions.
|
||||
%
|
||||
% The dimensionality of M, i.e. the number of dimensions of M, will match
|
||||
% the highest dimensionality contained in the cell array.
|
||||
%
|
||||
% CELL2MAT is not supported for cell arrays containing cell arrays or
|
||||
% objects.
|
||||
%
|
||||
% Example:
|
||||
% C = {[1] [2 3 4]; [5; 9] [6 7 8; 10 11 12]};
|
||||
% M = cell2mat(C)
|
||||
%
|
||||
% See also MAT2CELL, NUM2CELL
|
||||
|
||||
% Copyright 1984-2006 The MathWorks, Inc.
|
||||
% $Revision: 1.10.4.6 $ $Date: 2006/06/20 20:09:38 $
|
||||
|
||||
% Error out if there is no input argument
|
||||
if nargin==0
|
||||
error('MATLAB:cell2mat:NoInputs',['No input argument specified. ' ...
|
||||
'There should be exactly one input argument.'])
|
||||
end
|
||||
% short circuit for simplest case
|
||||
elements = numel(c);
|
||||
if elements == 0
|
||||
m = [];
|
||||
return
|
||||
end
|
||||
if elements == 1
|
||||
if isnumeric(c{1}) || ischar(c{1}) || islogical(c{1}) || isstruct(c{1})
|
||||
m = c{1};
|
||||
return
|
||||
end
|
||||
end
|
||||
% Error out if cell array contains mixed data types
|
||||
cellclass = class(c{1});
|
||||
ciscellclass = cellfun('isclass',c,cellclass);
|
||||
if ~all(ciscellclass(:))
|
||||
error('MATLAB:cell2mat:MixedDataTypes', ...
|
||||
'All contents of the input cell array must be of the same data type.');
|
||||
end
|
||||
|
||||
% Error out if cell array contains any cell arrays or objects
|
||||
ciscell = iscell(c{1});
|
||||
cisobj = isobject(c{1});
|
||||
if cisobj || ciscell
|
||||
error('MATLAB:cell2mat:UnsupportedCellContent',['Cannot support cell ' ...
|
||||
'arrays containing cell arrays or objects.']);
|
||||
end
|
||||
|
||||
% If cell array of structures, make sure the field names are all the same
|
||||
if isstruct(c{1})
|
||||
cfields = cell(elements,1);
|
||||
for n=1:elements
|
||||
cfields{n} = fieldnames(c{n});
|
||||
end
|
||||
% Perform the actual field name equality test
|
||||
if ~isequal(cfields{:})
|
||||
error('MATLAB:cell2mat:InconsistentFieldNames', ...
|
||||
['The field names of each cell array element must be consistent ' ...
|
||||
'and in consistent order.'])
|
||||
end
|
||||
end
|
||||
|
||||
% If cell array is 2-D, execute 2-D code for speed efficiency
|
||||
if ndims(c) == 2
|
||||
rows = size(c,1);
|
||||
m = cell(rows,1);
|
||||
% Concatenate each row first
|
||||
for n=1:rows
|
||||
m{n} = cat(3,c{n,:});
|
||||
end
|
||||
% Now concatenate the single column of cells into a matrix
|
||||
m = cat(3,m{:});
|
||||
return
|
||||
end
|
||||
|
||||
csize = size(c);
|
||||
% Treat 3+ dimension arrays
|
||||
|
||||
% Construct the matrix by concatenating each dimension of the cell array into
|
||||
% a temporary cell array, CT
|
||||
% The exterior loop iterates one time less than the number of dimensions,
|
||||
% and the final dimension (dimension 1) concatenation occurs after the loops
|
||||
|
||||
% Loop through the cell array dimensions in reverse order to perform the
|
||||
% sequential concatenations
|
||||
for cdim=(length(csize)-1):-1:1
|
||||
% Pre-calculated outside the next loop for efficiency
|
||||
ct = cell([csize(1:cdim) 1]);
|
||||
cts = size(ct);
|
||||
ctsl = length(cts);
|
||||
mref = {};
|
||||
|
||||
% Concatenate the dimension, (CDIM+1), at each element in the temporary cell
|
||||
% array, CT
|
||||
for mind=1:prod(cts)
|
||||
[mref{1:ctsl}] = ind2sub(cts,mind);
|
||||
% Treat a size [N 1] array as size [N], since this is how the indices
|
||||
% are found to calculate CT
|
||||
if ctsl==2 && cts(2)==1
|
||||
mref = {mref{1}};
|
||||
end
|
||||
% Perform the concatenation along the (CDIM+1) dimension
|
||||
ct{mref{:}} = cat(cdim+1,c{mref{:},:});
|
||||
end
|
||||
% Replace M with the new temporarily concatenated cell array, CT
|
||||
c = ct;
|
||||
end
|
||||
|
||||
% Finally, concatenate the final rows of cells into a matrix
|
||||
m = cat(1,c{:});
|
||||
Loading…
Add table
Add a link
Reference in a new issue