Home > utilities > concat_by_struct.m

concat_by_struct

PURPOSE ^

A function to concatenate data contained within a structure.

SYNOPSIS ^

function all_data = concat_by_struct(in_struct,last)

DESCRIPTION ^

 A function to concatenate data contained within a structure.
     does something like cat(1,data(:).*);  
 function all_data = concat_by_struct(in_struct,last)
 
 DESCRIPTION:
    Concatenates data contained within a structure. It only works on the first dimension unless
     logical variable "last" is set to true.

 INPUT 
   in_struct  = Structured variable with dimension such as 
        in_struct(1:10).data1, in_struct(1:10).data2...
   last       = logical variable. Enable to work on last dimension only

 OUTPUT:
    all_data = struct with first dimension removed.

 EXAMPLE USAGE
    all_data = concat_by_struct(in_struct,true)

 Author(s):
    Ricardo Torres (Plymouth Marine Laboratory) 

 Revision history

   2018-03-22 First version in fvcom-toolbox.

==============================================================================

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function all_data = concat_by_struct(in_struct,last)
0002 
0003 % A function to concatenate data contained within a structure.
0004 %     does something like cat(1,data(:).*);
0005 % function all_data = concat_by_struct(in_struct,last)
0006 %
0007 % DESCRIPTION:
0008 %    Concatenates data contained within a structure. It only works on the first dimension unless
0009 %     logical variable "last" is set to true.
0010 %
0011 % INPUT
0012 %   in_struct  = Structured variable with dimension such as
0013 %        in_struct(1:10).data1, in_struct(1:10).data2...
0014 %   last       = logical variable. Enable to work on last dimension only
0015 %
0016 % OUTPUT:
0017 %    all_data = struct with first dimension removed.
0018 %
0019 % EXAMPLE USAGE
0020 %    all_data = concat_by_struct(in_struct,true)
0021 %
0022 % Author(s):
0023 %    Ricardo Torres (Plymouth Marine Laboratory)
0024 %
0025 % Revision history
0026 %
0027 %   2018-03-22 First version in fvcom-toolbox.
0028 %
0029 %==============================================================================
0030 
0031 subname = mfilename;
0032 global ftbverbose
0033 if ftbverbose
0034     fprintf('\nbegin : %s \n', subname)
0035 end
0036 
0037 vars = fieldnames(in_struct);
0038 maxl=1;sizes=1;
0039 for kk = 1:size(vars,1)
0040 % find largest record
0041 eval(['xyz=size(in_struct(1).',char(vars(kk)) ');'])
0042 sizes=[sizes;xyz(:)];;
0043 end
0044 
0045 for kk = 1:size(vars,1)
0046     if eval(['isstruct(in_struct(1).' char(vars(kk)) ')'])
0047         in_vars = fieldnames(in_struct);
0048         eval(['all_data.' char(vars(kk)) ' = concat_by_struct([in_struct.' char(vars(kk)) '],last);']);
0049     else
0050         eval(['xyz=ndims(in_struct(1).',char(vars(kk)) ');'])
0051         if last % If concatenating on the last dimension
0052             
0053                 eval(['all_data.' char(vars(kk)) ' = cat(xyz,in_struct(:).' char(vars(kk)) ');']);
0054         else % concatenate on the first dimension
0055                     eval(['all_data.' char(vars(kk)) ' = cat(1,in_struct(:).' char(vars(kk)) ');']);
0056         end
0057     end
0058 end
0059     
0060 if ftbverbose
0061   fprintf('end   : %s\n', subname)
0062 end

Generated on Wed 20-Feb-2019 16:06:01 by m2html © 2005