Mercurial > hg > octave-nkf
annotate scripts/general/cell2mat.m @ 9665:1dba57e9d08d
use blas_trans_type for xgemm
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sat, 26 Sep 2009 10:41:07 +0200 |
parents | eb63fbe60fab |
children | c0d0b6e37a36 |
rev | line source |
---|---|
8920 | 1 ## Copyright (C) 2005, 2006, 2007, 2008 Laurent Mazet |
5580 | 2 ## |
7016 | 3 ## This file is part of Octave. |
5580 | 4 ## |
7016 | 5 ## Octave is free software; you can redistribute it and/or modify it |
6 ## under the terms of the GNU General Public License as published by | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
5580 | 14 ## |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
5580 | 18 |
19 ## -*- texinfo -*- | |
20 ## @deftypefn {Function File} {@var{m} =} cell2mat (@var{c}) | |
21 ## Convert the cell array @var{c} into a matrix by concatenating all | |
22 ## elements of @var{c} into a hyperrectangle. Elements of @var{c} must | |
23 ## be numeric, logical or char, and @code{cat} must be able to | |
24 ## concatenate them together. | |
5642 | 25 ## @seealso{mat2cell, num2cell} |
5580 | 26 ## @end deftypefn |
27 | |
28 function m = cell2mat (c) | |
29 | |
30 if (nargin != 1) | |
6046 | 31 print_usage (); |
5580 | 32 endif |
33 | |
34 if (! iscell (c)) | |
35 error ("cell2mat: c is not a cell array"); | |
36 endif | |
37 | |
38 nb = numel (c); | |
39 | |
40 if (nb == 0) | |
41 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 | |
8103
3b2346046d32
improve speed of cell2mat
David Bateman <dbateman@free.fr>
parents:
8102
diff
changeset
|
51 elseif (ndims (c) == 2) |
3b2346046d32
improve speed of cell2mat
David Bateman <dbateman@free.fr>
parents:
8102
diff
changeset
|
52 nr = rows (c); |
8107
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
53 nc = columns (c); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
54 if (nc > nr) |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
55 c1 = cell (nr, 1); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
56 for i = 1 : nr |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
57 c1{i} = [c{i : nr : end}]; |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
58 endfor |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
59 m = cat (1, c1 {:}); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
60 else |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
61 c1 = cell (nc, 1); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
62 for i = 1 : nc |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
63 c1{i} = cat (1, c{(i - 1) * nr + [1 : nr]}); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
64 endfor |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
65 m = [c1{:}]; |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
66 endif |
5580 | 67 else |
8107
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
68 ## n dimensions case |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
69 for k = ndims (c):-1:2, |
5580 | 70 sz = size (c); |
71 sz(end) = 1; | |
72 c1 = cell (sz); | |
8107
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
73 for i = 1:(prod (sz)) |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
74 c1{i} = cat (k, c{i:(prod (sz)):end}); |
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
75 endfor |
5580 | 76 c = c1; |
77 endfor | |
8107
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
78 m = cat (1, c1{:}); |
5580 | 79 endif |
8107
8655dc0906e6
Special case single type conacation in Fcat. Rework cell2mat to take advantage
David Bateman <dbateman@free.fr>
parents:
8103
diff
changeset
|
80 |
5580 | 81 endfunction |
82 | |
83 ## Tests | |
84 %!shared C, D, E, F | |
85 %! C = {[1], [2 3 4]; [5; 9], [6 7 8; 10 11 12]}; | |
86 %! D = C; D(:,:,2) = C; | |
87 %! E = [1 2 3 4; 5 6 7 8; 9 10 11 12]; | |
88 %! F = E; F(:,:,2) = E; | |
89 %!assert (cell2mat (C), E); | |
5716 | 90 %!assert (cell2mat (D), F); |
5580 | 91 ## Demos |
92 %!demo | |
93 %! C = {[1], [2 3 4]; [5; 9], [6 7 8; 10 11 12]}; | |
94 %! cell2mat (C) |