Mercurial > hg > octave-lyh
diff scripts/general/cell2mat.m @ 8107:8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
author | David Bateman <dbateman@free.fr> |
---|---|
date | Wed, 17 Sep 2008 14:37:49 -0400 |
parents | 3b2346046d32 |
children | eb63fbe60fab |
line wrap: on
line diff
--- a/scripts/general/cell2mat.m +++ b/scripts/general/cell2mat.m @@ -50,44 +50,34 @@ endif elseif (ndims (c) == 2) nr = rows (c); - c1 = cell (nr, 1); - for i = 1 : nr - c1{i} = [c{i : nr : end}]; - endfor - ## This is faster than "c = cat(1, c{:})" - m = [cellfun(@(x) x.', c1, "UniformOutput", false){:}].'; + nc = columns (c); + if (nc > nr) + c1 = cell (nr, 1); + for i = 1 : nr + c1{i} = [c{i : nr : end}]; + endfor + m = cat (1, c1 {:}); + else + c1 = cell (nc, 1); + for i = 1 : nc + c1{i} = cat (1, c{(i - 1) * nr + [1 : nr]}); + endfor + m = [c1{:}]; + endif else - nd = ndims (c); - for k = nd : -1 : 2 + ## n dimensions case + for k = ndims (c):-1:2, sz = size (c); - if (k > ndims (c) || sz(end) == 1) - continue; - endif sz(end) = 1; c1 = cell (sz); - sz = prod (sz); - if (k == 2) - for i = 1 : sz - c1{i} = [c{i : sz : end}]; - endfor - else - ## This is faster than - ## for i = 1:sz, c1{i} = cat (k, c{i:(prod (sz)):end}); endfor - idx = [1, k, (3 : (k - 1)), 2, ((k + 1): nd)]; - c = cellfun(@(x) permute (x, idx), c, "UniformOutput", false); - for i = 1: sz - c1{i} = ipermute ([c{i : sz : end}], idx); - endfor - endif + for i = 1:(prod (sz)) + c1{i} = cat (k, c{i:(prod (sz)):end}); + endfor c = c1; endfor - if (numel (c) > 1) - idx = [2, 1, 3 : nd]; - m = ipermute([cellfun(@(x) permute (x, idx), c, "UniformOutput", false){:}], idx); - else - m = c{1}; - endif + m = cat (1, c1{:}); endif + endfunction ## Tests