Mercurial > hg > octave-terminal
changeset 4894:ab5870f984d9
[project @ 2004-06-03 19:32:02 by jwe]
author | jwe |
---|---|
date | Thu, 03 Jun 2004 19:32:02 +0000 |
parents | 1956583b08f7 |
children | 9df0048ae0a1 |
files | doc/interpreter/matrix.txi scripts/ChangeLog scripts/general/circshift.m scripts/general/shiftdim.m src/ChangeLog src/ov.cc |
diffstat | 6 files changed, 187 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/interpreter/matrix.txi +++ b/doc/interpreter/matrix.txi @@ -91,6 +91,10 @@ @DOCSTRING(reshape) +@DOCSTRING(circshift) + +@DOCSTRING(shiftdim) + @DOCSTRING(shift) @DOCSTRING(sort)
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,9 @@ +2004-06-03 David Bateman <dbateman@free.fr> + + * general/shiftdim.m: New function based on JWE code snippet. + + * general/circdim.m: New function. + 2004-05-06 David Bateman <dbateman@free.fr> * general/issquare.m: Fail if ndim(x) > 2.
new file mode 100644 --- /dev/null +++ b/scripts/general/circshift.m @@ -0,0 +1,85 @@ +## Copyright (C) 2004 David Bateman +## +## This file is part of Octave. +## +## Octave 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, or (at your option) +## any later version. +## +## Octave 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 Octave; see the file COPYING. If not, write to the Free +## Software Foundation, 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y}} = circshift (@var{x}, @var{n}) +## Circularly shifts the values of the array @var{x}. @var{n} must be +## a vector of integers no longer than the number of dimensions in +## @var{x}. The values of @var{n} can be either positive or negative, +## which determines the direction in which the values or @var{x} are +## shifted. If an element of @var{n} is zero, then the corresponding +## dimension of @var{x} will not be shifted. For example +## +## @example +## @group +## x = [1, 2, 3; 4, 5, 6, 7, 8, 9]; +## circshift (x, 1) +## @result{} 7, 8, 9 +## 1, 2, 3 +## 4, 5, 6 +## circshift (x, -2) +## @result{} 7, 8, 9 +## 1, 2, 3 +## 4, 5, 6 +## circshift (x, [0,1]) +## @result{} 3, 1, 2 +## 6, 4, 5 +## 9, 7, 8 +## @end group +## @end example +## @end deftypefn +## @seealso {permute, ipermute, shiftdim} + +function y = circshift (x, n) + + if (nargin == 2) + nd = ndims (x); + sz = size (x); + + if (!isvector(n) && length(n) > nd) + error ("circshift: n must be a vector, no longer than the number of dimension in x"); + endif + + if (any(n != floor(n))) + error ("circshift: all values of n must be integers"); + endif + + idx = cell (); + for i = 1 : length(n); + nn = n(i); + if (nn < 0) + while (sz(i) <= - nn) + nn = nn + sz(i); + endwhile + idx {i} = [(1-nn):sz(i),1:-nn]; + else + while (sz(i) <= nn) + nn = nn - sz(i); + endwhile + idx {i} = [(sz(i)-nn+1):sz(i),1:(sz(i)-nn)]; + endif + endfor + for i = (length(n) + 1) : nd + idx{i} = 1:sz(i); + endfor + y = x (idx{:}); + else + usage ("circshift (x, n)"); + endif +endfunction
new file mode 100644 --- /dev/null +++ b/scripts/general/shiftdim.m @@ -0,0 +1,83 @@ +## Copyright (C) 2004 John Eaton, David Bateman +## +## This file is part of Octave. +## +## Octave 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, or (at your option) +## any later version. +## +## Octave 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 Octave; see the file COPYING. If not, write to the Free +## Software Foundation, 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{y}} = shiftdim (@var{x}, @var{n}) +## @deftypefnx {Function File} {[@var{y}, @var{ns}]} = shiftdim (@var{x}) +## Shifts the dimension of @var{x} by @var{n}, where @var{n} must be +## an integer scalar. When @var{n} is negative, the dimensions of +## @var{x} are shifted to the left, with the leading dimensions +## circulated to the end. If @var{n} is positive, then the dimensions +## of @var{x} are shifted to the right, with the @var{n} singleton +## dimensions added. +## +## Called with a single argument, @code{shiftdim}, removes the leading +## singleton dimensions, returning the number of dimensions removed +## in the second output argument @var{ns}. +## +## For example +## +## @example +## @group +## x = ones (1, 2, 3); +## size (shiftdim (x, -1)) +## @result{} [2, 3, 1] +## size (shiftdim (x, 1)) +## @result{} [1, 1, 2, 3] +## [b, ns] = shiftdim (x); +## @result{} b = [1, 1, 1; 1, 1, 1] +## @result{} ns = 1 +## @end group +## @end example +## @end deftypefn +## @seealso {reshape, permute, ipermute, circshift, squeeze} + +function [y, ns] = shiftdim (x, n) + + if (nargin == 1) + ## Find the first singleton dimension + nd = ndims (x); + orig_dims = size (x); + ns = 1; + while (ns < nd + 1 && orig_dims(ns) == 1) + ns = ns + 1; + endwhile + if (ns > nd) + ns = 1; + endif + y = reshape (x, orig_dims ([ns:end])); + ns = ns - 1; + elseif (nargin == 2) + if (!isscalar(n) && floor(n) != n) + error ("shiftdim: n must be an scalar integer"); + endif + if (n < 0) + orig_dims = size (x); + singleton_dims = ones (1, -n); + y = reshape (x, [singleton_dims, orig_dims]); + elseif (n > 0) + ndims = length (size (x)); + y = permute (x, [n+1:ndims, 1:n]); + else + y = x; + endif + else + usage ("shiftdim (x, n) or [b, ns] = shiftdim (x)"); + endif +endfunction
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,9 +1,12 @@ 2004-05-07 John W. Eaton <jwe@octave.org> + * ov.cc (octave_value::print_with_name): Only print name tag if + Vprint_answer_id_name is true. + * octave.cc (intern_argv): Insert __nargin__ in top_level_sym_tab instead of making it a builtin variable. Mark it static. - * ov-usr-fcn.cc (install_automatic_vars): Mark local automatic - variables static. + * ov-usr-fcn.cc (octave_user_function::install_automatic_vars): + Mark local automatic variables static. 2004-04-30 John W. Eaton <jwe@octave.org>