[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Changeset} Re: cellfunc vs cell2mat speed?
From: |
David Bateman |
Subject: |
[Changeset} Re: cellfunc vs cell2mat speed? |
Date: |
Wed, 10 Sep 2008 01:23:17 +0200 |
User-agent: |
Thunderbird 2.0.0.16 (X11/20080725) |
I'd suggest something like teh attached changeset that improves the
speed but keeps teh code compatible.
D.
# HG changeset patch
# User David Bateman <address@hidden>
# Date 1221002489 -7200
# Node ID 7bd7ce1d2634dab6969acc76af0de702f9eb222f
# Parent eb774ade7516a05fdc6a3dec59eaa15ab1827ddd
improve speed of cell2mat
diff --git a/scripts/ChangeLog b/scripts/ChangeLog
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,7 @@ 2008-09-09 John W. Eaton <address@hidden
+2008-09-09 David Bateman <address@hidden>
+
+ * general/cell2mat.m: Improve the speed..
+
2008-09-09 John W. Eaton <address@hidden>
* time/datestr.m: Convert format and use strftime to do most of
diff --git a/scripts/general/cell2mat.m b/scripts/general/cell2mat.m
--- a/scripts/general/cell2mat.m
+++ b/scripts/general/cell2mat.m
@@ -48,20 +48,46 @@ function m = cell2mat (c)
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{:})"
+ c = [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];
+ c = ipermute([cellfun(@(x) permute (x, idx), c, "UniformOutput",
false){:}], idx);
+ else
+ c = c{1};
+ endif
endif
-
endfunction
## Tests
- cellfunc vs cell2mat speed?, Levente Torok, 2008/09/09
- Re: cellfunc vs cell2mat speed?, David Bateman, 2008/09/09
- Re: cellfunc vs cell2mat speed?, Levente Torok, 2008/09/09
- Re: cellfunc vs cell2mat speed?, David Bateman, 2008/09/09
- Re: cellfunc vs cell2mat speed?, Levente Torok, 2008/09/09
- Re: cellfunc vs cell2mat speed?, David Bateman, 2008/09/09
- [Changeset} Re: cellfunc vs cell2mat speed?,
David Bateman <=
- [Changeset} Re: cellfunc vs cell2mat speed?, John W. Eaton, 2008/09/11
- Re: [Changeset} Re: cellfunc vs cell2mat speed?, David Bateman, 2008/09/15
- Re: [Changeset} Re: cellfunc vs cell2mat speed?, John W. Eaton, 2008/09/17
- Re: [Changeset} Re: cellfunc vs cell2mat speed?, dbateman, 2008/09/17
- Re: [Changeset} Re: cellfunc vs cell2mat speed?, John W. Eaton, 2008/09/17