function [ header_blocks, data_blocks ] = cssm()
fid = fopen( 'cssm.txt' );
cac = textscan( fid, '%s', 'Whitespace','', 'Delimiter','\n' );
fclose( fid );
number_of_floats = cellfun( @(c) size(c,2) ...
, regexp( cac{:}, '[+|-]?\d*\.\d+', 'match' ) ...
, 'uni', true );
number_of_stuff = cellfun( @(c) size(c,2) ...
, regexp( cac{:}, '[^([+|-]?\d*\.\d+) ]', 'match' ) ...
, 'uni', true );
is_data = ( number_of_floats >= 1 & number_of_stuff == 0 );
number_of_data_columns = number_of_floats;
number_of_data_columns( not(is_data) ) = nan;
[ ~, ix1, ix2 ] = getblocks( number_of_data_columns, 2 );
data_blocks = cell(0);
for ii = 1 : numel( ix1 )
data_blocks = cat( 1, data_blocks ...
, {str2num( char(cac{1}{ix1(ii):ix2(ii)}))} );
end
ix3 = cat( 2, 1, ix2+1 );
ix4 = cat( 2, ix1-1, size( cac{1}, 1 ) );
header_blocks = cell(0);
for ii = 1 : numel( ix1 )
header_blocks = cat( 1, header_blocks ...
, {cac{:}(ix3(ii):ix4(ii))} );
end
end
function [ col, ix1, ix2 ] = getblocks( sequence, min_nrows )
seq = cat( 2, nan, transpose( sequence(:) ), nan );
change = diff( double( diff( seq ) == 0 ) );
ix1 = strfind( change, +1 );
ix2 = strfind( change, -1 );
col = sequence( ix1 );
if min_nrows >= 2
isg = ix2-ix1+1 >= min_nrows;
col = col( isg );
ix1 = ix1( isg );
ix2 = ix2( isg );
else
ix_sngl = find( not( logical( cumsum( change ) ...
+ double( change==-1 ) ) ) );
ix1 = cat( 2, ix1, ix_sngl );
ix2 = cat( 2, ix2, ix_sngl );
col = cat( 2, col, sequence( ix_sngl ) );
[~,ix] = sort( ix1 );
ix1 = ix1( ix );
ix2 = ix2( ix );
col = col( ix );
end
end