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