[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
cellfun/arrayfun
From: |
David Bateman |
Subject: |
cellfun/arrayfun |
Date: |
Mon, 19 Mar 2007 14:17:03 +0100 |
User-agent: |
Thunderbird 1.5.0.7 (X11/20060921) |
Here is a patch that adds Bill's arrayfun function (cf
http://www.cae.wisc.edu/pipermail/octave-maintainers/2006-October/000805.html),
and fixes a problem in cellfun where the shape of the output array was
not respected, as I noticed morning...
Regards
David
--
David Bateman address@hidden
Motorola Labs - Paris +33 1 69 35 48 04 (Ph)
Parc Les Algorithmes, Commune de St Aubin +33 6 72 01 06 33 (Mob)
91193 Gif-Sur-Yvette FRANCE +33 1 69 35 77 01 (Fax)
The information contained in this communication has been classified as:
[x] General Business Information
[ ] Motorola Internal Use Only
[ ] Motorola Confidential Proprietary
*** ./scripts/general/arrayfun.m.orig55 2007-03-19 14:07:42.652034652 +0100
--- ./scripts/general/arrayfun.m 2007-03-19 10:48:19.025807150 +0100
***************
*** 0 ****
--- 1,64 ----
+ ## Copyright (C) 2006 Bill Denney <address@hidden>
+ ##
+ ## This program is free software; you can redistribute it and/or modify
+ ## it under the terms of the GNU General Public License as published by
+ ## the Free Software Foundation; either version 2 of the License, or
+ ## (at your option) any later version.
+ ##
+ ## This program is distributed in the hope that it will be useful,
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ## GNU General Public License for more details.
+ ##
+ ## You should have received a copy of the GNU General Public License
+ ## along with this program; if not, write to the Free Software
+ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ ## -*- texinfo -*-
+ ## @deftypefn {Command} @var{a} = arrayfun(@var{name}, @var{c})
+ ## @deftypefnx {Command} @var{a} = arrayfun(@var{func}, @var{c})
+ ## @deftypefnx {Command} @var{a} = arrayfun(@var{func}, @var{c}, @var{d})
+ ## @deftypefnx {Command} @var{a} = arrayfun(@var{func}, @var{c},
@var{options})
+ ## @deftypefnx {Command} address@hidden, @var{b}, @dots{}] =
arrayfun(@var{func}, @var{c}, @dots{})
+ ## Execute a function on each element of an array.
+ ##
+ ## See cellfun for complete usage instructions.
+ ## @seealso{cellfun}
+ ## @end deftypefn
+
+ function [varargout] = arrayfun(func, varargin)
+
+ if (nargin < 2)
+ print_usage();
+ endif
+
+ ## convert everything to cells and call cellfun (let cellfun error
+ ## check the options in case more options come available)
+ sizetomatch = size(varargin{1});
+ m2cargs{1} = ones (size (varargin{1}, 1), 1);
+ m2cargs{2} = ones (size (varargin{1}, 2), 1);
+ cfarg{1} = mat2cell (varargin{1}, m2cargs{:});
+ stillmatches = true;
+ idx = 1;
+ while stillmatches && (idx < length(varargin))
+ idx++;
+ thissize = size (varargin{idx});
+ if (length (thissize) == length (sizetomatch)) && \
+ all (thissize == sizetomatch)
+ if ischar (varargin{idx}) && \
+ (strcmpi (varargin{idx}, "UniformOutput") || \
+ strcmpi (varargin{idx}, "ErrorHandler"))
+ ## catch these strings just in case they happen to be the same
+ ## size as the other input.
+ stillmatches = false;
+ else
+ cfarg{idx} = mat2cell (varargin{idx}, m2cargs{:});
+ endif
+ else
+ stillmatches = false;
+ endif
+ endwhile
+
+ varargout = cell (max ([nargout, 1]), 1);
+ [varargout{:}] = cellfun (func, cfarg{:}, varargin{idx+1:length(varargin)});
+ endfunction
*** ./scripts/general/Makefile.in.orig55 2007-03-19 14:07:50.198655233
+0100
--- ./scripts/general/Makefile.in 2007-03-19 14:08:22.483032120 +0100
***************
*** 20,27 ****
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
! SOURCES = __isequal__.m bicubic.m bitcmp.m bitget.m bitset.m \
! blkdiag.m cart2pol.m cart2sph.m cell2mat.m circshift.m \
common_size.m cplxpair.m cumtrapz.m deal.m diff.m flipdim.m \
fliplr.m flipud.m gradient.m ind2sub.m int2str.m interp1.m \
interp2.m interpft.m is_duplicate_entry.m isa.m isdefinite.m \
--- 20,27 ----
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
! SOURCES = __isequal__.m arrayfun.m bicubic.m bitcmp.m bitget.m \
! bitset.m blkdiag.m cart2pol.m cart2sph.m cell2mat.m circshift.m \
common_size.m cplxpair.m cumtrapz.m deal.m diff.m flipdim.m \
fliplr.m flipud.m gradient.m ind2sub.m int2str.m interp1.m \
interp2.m interpft.m is_duplicate_entry.m isa.m isdefinite.m \
*** ./src/DLD-FUNCTIONS/cellfun.cc.orig55 2006-09-14 04:10:46.000000000
+0200
--- ./src/DLD-FUNCTIONS/cellfun.cc 2007-03-19 13:49:40.937343268 +0100
***************
*** 401,408 ****
if (error_state)
goto cellfun_err;
! val.resize(f_args.dims());
! retval(j) = val;
}
}
else
--- 401,407 ----
if (error_state)
goto cellfun_err;
! retval(j) = val.resize(f_args.dims());
}
}
else
***************
*** 521,526 ****
--- 520,527 ----
%!assert(cellfun('size',{zeros([1,2,3]),1},3),[3,1])
%!assert(cellfun(@atan2,{1,1},{1,2}),[atan2(1,1),atan2(1,2)])
%!assert(cellfun(@atan2,{1,1},{1,2},'UniformOutput',false),{atan2(1,1),atan2(1,2)})
+ %!assert(cellfun(@sin,{1,2;3,4}),sin([1,2;3,4]))
+ %!assert(cellfun(@atan2,{1,1;1,1},{1,2;1,2}),atan2([1,1;1,1],[1,2;1,2]))
%!error(cellfun(@factorial,{-1,3}))
%!assert(cellfun(@factorial,{-1,3},'ErrorHandler',@(x,y) NaN),[NaN,6])
%!test
2007-03-19 David Bateman <address@hidden>
* general/arrayfun.m: New function (for Bill Denney)
* general/Makefile.in: Include it in SOURCES
2007-03-19 David Bateman <address@hidden>
* DLD-FUNCTIONS/cellfun.cc (Fcellfun): Correct for shape of return
matrix for the case of UniformOutput being true.
- cellfun/arrayfun,
David Bateman <=