Mercurial > hg > octave-lyh
comparison scripts/general/cell2mat.m @ 9860:c0d0b6e37a36
improve cell2mat
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 24 Nov 2009 13:40:51 +0100 |
parents | eb63fbe60fab |
children | 03d0dea2309d |
comparison
equal
deleted
inserted
replaced
9859:5919f2bd9a99 | 9860:c0d0b6e37a36 |
---|---|
35 error ("cell2mat: c is not a cell array"); | 35 error ("cell2mat: c is not a cell array"); |
36 endif | 36 endif |
37 | 37 |
38 nb = numel (c); | 38 nb = numel (c); |
39 | 39 |
40 ## We only want numeric, logical, and char matrices. | |
41 valid = cellfun (@isnumeric, c); | |
42 valid |= cellfun (@islogical, c); | |
43 valid |= cellfun (@ischar, c); | |
44 | |
45 if (! all (valid)) | |
46 error ("cell2mat: elements must be numeric, char or logical"); | |
47 endif | |
48 | |
40 if (nb == 0) | 49 if (nb == 0) |
41 m = []; | 50 m = []; |
42 elseif (nb == 1) | |
43 elt = c{1}; | |
44 if (isnumeric (elt) || ischar (elt) || islogical (elt)) | |
45 m = elt; | |
46 elseif (iscell (elt)) | |
47 m = cell2mat (elt); | |
48 else | |
49 error ("cell2mat: all elements of cell array must be numeric, logical or char"); | |
50 endif | |
51 elseif (ndims (c) == 2) | 51 elseif (ndims (c) == 2) |
52 nr = rows (c); | 52 ## 2d case optimized |
53 nc = columns (c); | 53 [nr, nc] = size (c); |
54 if (nc > nr) | 54 if (nc > nr) |
55 c1 = cell (nr, 1); | 55 c1 = cell (nr, 1); |
56 for i = 1 : nr | 56 for i = 1 : nr |
57 c1{i} = [c{i : nr : end}]; | 57 c1{i} = [c{i,:}]; |
58 endfor | 58 endfor |
59 m = cat (1, c1 {:}); | 59 m = vertcat (c1 {:}); |
60 else | 60 else |
61 c1 = cell (nc, 1); | 61 c1 = cell (nc, 1); |
62 for i = 1 : nc | 62 for i = 1 : nc |
63 c1{i} = cat (1, c{(i - 1) * nr + [1 : nr]}); | 63 c1{i} = vertcat (c{:,i}); |
64 endfor | 64 endfor |
65 m = [c1{:}]; | 65 m = [c1{:}]; |
66 endif | 66 endif |
67 else | 67 else |
68 ## n dimensions case | 68 ## n dimensions case |
69 for k = ndims (c):-1:2, | 69 for k = ndims (c):-1:2, |
70 sz = size (c); | 70 sz = size (c); |
71 sz(end) = 1; | 71 sz(k) = 1; |
72 c1 = cell (sz); | 72 c1 = cell (sz); |
73 for i = 1:(prod (sz)) | 73 n1 = prod (sz); |
74 c1{i} = cat (k, c{i:(prod (sz)):end}); | 74 for i = 1:n1 |
75 c1{i} = cat (k, c{i:n1:end}); | |
75 endfor | 76 endfor |
76 c = c1; | 77 c = c1; |
77 endfor | 78 endfor |
78 m = cat (1, c1{:}); | 79 m = cat (1, c1{:}); |
79 endif | 80 endif |
86 %! D = C; D(:,:,2) = C; | 87 %! D = C; D(:,:,2) = C; |
87 %! E = [1 2 3 4; 5 6 7 8; 9 10 11 12]; | 88 %! E = [1 2 3 4; 5 6 7 8; 9 10 11 12]; |
88 %! F = E; F(:,:,2) = E; | 89 %! F = E; F(:,:,2) = E; |
89 %!assert (cell2mat (C), E); | 90 %!assert (cell2mat (C), E); |
90 %!assert (cell2mat (D), F); | 91 %!assert (cell2mat (D), F); |
92 %!test | |
93 %! m = rand (10) + i * rand (10); | |
94 %! c = mat2cell (m, [1 2 3 4], [4 3 2 1]); | |
95 %! assert (cell2mat (c), m) | |
96 %!test | |
97 %! m = int8 (256*rand (4, 5, 6, 7, 8)); | |
98 %! c = mat2cell (m, [1 2 1], [1 2 2], [3 1 1 1], [4 1 2], [3 1 4]); | |
99 %! assert (cell2mat (c), m) | |
91 ## Demos | 100 ## Demos |
92 %!demo | 101 %!demo |
93 %! C = {[1], [2 3 4]; [5; 9], [6 7 8; 10 11 12]}; | 102 %! C = {[1], [2 3 4]; [5; 9], [6 7 8; 10 11 12]}; |
94 %! cell2mat (C) | 103 %! cell2mat (C) |