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	Mon May 17 19:01:07 2004 +0000
+++ b/doc/interpreter/matrix.txi	Thu Jun 03 19:32:02 2004 +0000
@@ -91,6 +91,10 @@
 
 @DOCSTRING(reshape)
 
+@DOCSTRING(circshift)
+
+@DOCSTRING(shiftdim)
+
 @DOCSTRING(shift)
 
 @DOCSTRING(sort)
--- a/scripts/ChangeLog	Mon May 17 19:01:07 2004 +0000
+++ b/scripts/ChangeLog	Thu Jun 03 19:32:02 2004 +0000
@@ -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.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/general/circshift.m	Thu Jun 03 19:32:02 2004 +0000
@@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/general/shiftdim.m	Thu Jun 03 19:32:02 2004 +0000
@@ -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	Mon May 17 19:01:07 2004 +0000
+++ b/src/ChangeLog	Thu Jun 03 19:32:02 2004 +0000
@@ -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>
 
--- a/src/ov.cc	Mon May 17 19:01:07 2004 +0000
+++ b/src/ov.cc	Thu Jun 03 19:32:02 2004 +0000
@@ -1301,7 +1301,10 @@
 {
   if (! (evaluating_function_body && Vsilent_functions))
     {
-      bool pad_after = print_name_tag (output_buf, name);
+      bool pad_after = false;
+
+      if (Vprint_answer_id_name)
+	pad_after = print_name_tag (output_buf, name);
 
       print (output_buf);