Mercurial > octave-nkf
diff scripts/general/cell2mat.m @ 8101:86955a1559c5
improve speed of cell2mat
* * *
trivial fix for previous cell2mat change
author | David Bateman <dbateman@free.fr> |
---|---|
date | Thu, 11 Sep 2008 16:57:12 -0400 |
parents | a1dbe9d80eee |
children | c066714ee5d5 |
line wrap: on
line diff
--- a/scripts/general/cell2mat.m Thu Sep 11 15:53:37 2008 -0400 +++ b/scripts/general/cell2mat.m Thu Sep 11 16:57:12 2008 -0400 @@ -48,20 +48,46 @@ else error ("cell2mat: all elements of cell array must be numeric, logical or char"); 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){:}].'; else - ## n dimensions case - for k = ndims (c):-1:2, + nd = ndims (c); + for k = nd : -1 : 2 sz = size (c); + if (k > ndims (c) || sz(end) == 1) + continue; + endif sz(end) = 1; c1 = cell (sz); - for i = 1:(prod (sz)) - c1{i} = cat (k, c{i:(prod (sz)):end}); - endfor + 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 c = c1; endfor - m = cat (1, c1{:}); + 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 endif - endfunction ## Tests