wolffd@0: function x = uncell(x,lvl) wolffd@0: % lvl >= 0: The recursion level, starting from 0, when observing the wolffd@0: % cell structures of cell structures of etc. of the input data x. wolffd@0: % lvl = NaN: wolffd@0: % lvl = -Inf: used in display of segmented mirscalar wolffd@0: if nargin < 2 wolffd@0: lvl = 0; wolffd@0: end wolffd@0: if iscell(x) wolffd@0: if isempty(x) wolffd@0: x = []; wolffd@0: elseif length(x) == 1 wolffd@0: x = uncell(x{1},lvl+1); wolffd@0: else wolffd@0: het = 0; % Flags different kinds of structures: wolffd@0: % - structures with fixed column size but variable nb of columns (het = 1) wolffd@0: % - structures with variable column size but fixed nb of columns (het = 2) wolffd@0: % - structures with variable column size and variable nb of columns (het = NaN) wolffd@0: l = length(x(:,:,1)); wolffd@0: nf = size(x,3); wolffd@0: z = cell(size(x)); wolffd@0: for i1 = 1:size(x,1) wolffd@0: for i2 = 1:size(x,2) wolffd@0: for i3 = 1:size(x,3) wolffd@0: z{i1,i2,i3} = uncell(x{i1,i2,i3},lvl+1); wolffd@0: if i1 == 1 && i2 == 1 && i3 == 1 wolffd@0: s = size(z{i1,i2,i3}); wolffd@0: elseif not(isequal(s,size(z{i1,i2,i3}))) wolffd@0: % A break in the homogeneity has been discovered. wolffd@0: if lvl>0 wolffd@0: if (het == 0 || het == 2) && (s(2) == size(z{i1,i2,i3},2)) wolffd@0: het = 2; wolffd@0: s = max(s,size(z{i1,i2,i3})); wolffd@0: elseif (het == 0 || het == 1) && (s(1) == size(z{i1,i2,i3},1)) wolffd@0: het = 1; wolffd@0: s = max(s,size(z{i1,i2,i3})); wolffd@0: else wolffd@0: het = NaN; wolffd@0: end wolffd@0: else wolffd@0: het = NaN; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: if isnan(het) wolffd@0: x = z; wolffd@0: else wolffd@0: if size(s)<3 wolffd@0: s(3) = 1; wolffd@0: end wolffd@0: if (s(1)>1 || isnan(lvl)) || lvl == -Inf wolffd@0: x = NaN([s(1) l*s(2) nf*s(3:end)]); wolffd@0: for j = 1:nf wolffd@0: for i = 1:l wolffd@0: if size(z,1)>size(z,2) wolffd@0: zij = z{i,1,j}; wolffd@0: else wolffd@0: zij = z{1,i,j}; wolffd@0: end wolffd@0: if size(zij,3) == 1 wolffd@0: x(1:size(z{1,i,j},1),... wolffd@0: (i-1)*s(2)+1:(i-1)*s(2)+size(z{1,i,j},2),... wolffd@0: j,1:size(z{1,i,j},4)) = z{1,i,j}; wolffd@0: elseif nf == 1 wolffd@0: x(1:size(z{1,i,j},1),... wolffd@0: (i-1)*s(2)+1:(i-1)*s(2)+size(z{1,i,j},2),... wolffd@0: :,1:size(z{1,i,j},4)) = z{1,i,j}; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: x = NaN([l*s(1) s(2) nf*s(3:end)]); wolffd@0: for j = 1:nf wolffd@0: for i = 1:l wolffd@0: if size(z,1)>size(z,2) wolffd@0: zij = z{i,1,j}; wolffd@0: else wolffd@0: zij = z{1,i,j}; wolffd@0: end wolffd@0: if ischar(zij) && length(zij) == 1 && zij>='A' && zij <= 'G' wolffd@0: %zi wolffd@0: zij = zij-'A'; wolffd@0: end wolffd@0: x((i-1)*s(1)*size(zij,1)+1:(i-1)*s(1)*size(zij,1)+size(zij,1),... wolffd@0: 1:size(zij,2),... wolffd@0: j,... wolffd@0: 1:size(zij,4)) = zij; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: elseif ischar(x) wolffd@0: switch x wolffd@0: case 'C' wolffd@0: x = 0; wolffd@0: case 'C#' wolffd@0: x = 1; wolffd@0: case 'D' wolffd@0: x = 2; wolffd@0: case 'D#' wolffd@0: x = 3; wolffd@0: case 'E' wolffd@0: x = 4; wolffd@0: case 'F' wolffd@0: x = 5; wolffd@0: case 'F#' wolffd@0: x = 6; wolffd@0: case 'G' wolffd@0: x = 7; wolffd@0: case 'G#' wolffd@0: x = 8; wolffd@0: case 'A' wolffd@0: x = 9; wolffd@0: case 'A#' wolffd@0: x = 10; wolffd@0: case 'B' wolffd@0: x = 11; wolffd@0: end wolffd@0: elseif 0 %scal wolffd@0: if size(x,1)==1 && size(x,2)==1 && size(x,3)>1 wolffd@0: x = shiftdim(x,2); wolffd@0: else wolffd@0: %y = zeros(size(x,2),size(x,1),size(x,3)); wolffd@0: %y = zeros(size(x)); wolffd@0: %for i = 1:size(x,3) wolffd@0: % y(:,:,i) = x(:,:,i); wolffd@0: %end wolffd@0: %x = y; wolffd@0: end wolffd@0: elseif 0 %not(isnan(lvl)) && lvl>=0 wolffd@0: %x = squeeze(x); wolffd@0: if size(x,1) == 1 wolffd@0: x = x(:); wolffd@0: end wolffd@0: elseif 0 %size(x,3) > 1 && size(x,1) == 1 wolffd@0: x = reshape(x,size(x,2),size(x,3))'; wolffd@0: end