# HG changeset patch # User Rik # Date 1317664870 25200 # Node ID 571557ddabb94cfc66673d99a758999d187ea995 # Parent f26ea04b5356890a01af4192a25919c69ca27fdb# Parent 46f5e41c861076d6faa999be09b2b7dbb2fcbd32 maint: periodic merge of stable to default. diff -r f26ea04b5356 -r 571557ddabb9 NEWS --- a/NEWS Mon Oct 03 12:48:15 2011 -0400 +++ b/NEWS Mon Oct 03 11:01:10 2011 -0700 @@ -83,10 +83,15 @@ __error_text__ sylvester_matrix error_text +Summary of important user-visible changes for version 3.4.3: +----------------------------------------------------------- + + ** Octave 3.4.3 is a bug fixing release. + Summary of important user-visible changes for version 3.4.2: ----------------------------------------------------------- - ** Octave 3.2.4 fixes some minor installation problems that affected + ** Octave 3.4.2 fixes some minor installation problems that affected version 3.4.1. Summary of important user-visible changes for version 3.4.1: diff -r f26ea04b5356 -r 571557ddabb9 configure.ac --- a/configure.ac Mon Oct 03 12:48:15 2011 -0400 +++ b/configure.ac Mon Oct 03 11:01:10 2011 -0700 @@ -31,7 +31,7 @@ dnl PACKAGE_VERSION is set by the AC_INIT VERSION arg OCTAVE_VERSION="$PACKAGE_VERSION" -OCTAVE_API_VERSION_NUMBER="44" +OCTAVE_API_VERSION_NUMBER="45" OCTAVE_API_VERSION="api-v$OCTAVE_API_VERSION_NUMBER+" OCTAVE_RELEASE_DATE="2011-01-22" OCTAVE_COPYRIGHT="Copyright (C) 2011 John W. Eaton and others." diff -r f26ea04b5356 -r 571557ddabb9 etc/HACKING --- a/etc/HACKING Mon Oct 03 12:48:15 2011 -0400 +++ b/etc/HACKING Mon Oct 03 11:01:10 2011 -0700 @@ -158,7 +158,21 @@ testfun * unit testing time * time and date functions - src -- the interpreter itself + src -- the interpreter itself plus lots of infrastructure + around it. Octave's extensive octave_value class + hierarchy for polymorphically handling all Octave + types is defined here. The built-in functions are + also defined here, so if "help foo" tells you foo is + built-in, its source will be somewhere in this + directory. + DLD-FUNCTIONS * Dynamically linked oct files. If you see "help foo" + telling you that foo is defined in foo.oct, then + foo.cc will be found here and contain the source + code. + OPERATORS * Definitions and template instantiations for + operators for all possible Octave type + combinations. + TEMPLATE-INST * Some C++ template instantiations. test -- tests for the interpreter test_*.m * fixed tests for the interpreter @@ -170,7 +184,8 @@ jwe@octave.org -Last updated: Sat Jan 22 22:00:25 PST 2011 +Last updated: Wed Sep 28 22:37:37 CDT 2011 + ################################################################################ diff -r f26ea04b5356 -r 571557ddabb9 scripts/optimization/sqp.m --- a/scripts/optimization/sqp.m Mon Oct 03 12:48:15 2011 -0400 +++ b/scripts/optimization/sqp.m Mon Oct 03 11:01:10 2011 -0700 @@ -22,7 +22,7 @@ ## @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}) ## @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}) ## @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}) -## @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}, @var{tolerance}) +## @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}, @var{tol}) ## Solve the nonlinear program ## @tex ## $$ @@ -62,14 +62,8 @@ ## The first argument is the initial guess for the vector @var{x0}. ## ## The second argument is a function handle pointing to the objective -## function. The objective function must be of the form -## -## @example -## @var{y} = phi (@var{x}) -## @end example -## -## @noindent -## in which @var{x} is a vector and @var{y} is a scalar. +## function @var{phi}. The objective function must accept one vector +## argument and return a scalar. ## ## The second argument may also be a 2- or 3-element cell array of ## function handles. The first element should point to the objective @@ -80,40 +74,18 @@ ## differences. If the Hessian function is not supplied, a BFGS update ## formula is used to approximate the Hessian. ## -## When supplied, the gradient function must be of the form -## -## @example -## @var{g} = gradient (@var{x}) -## @end example -## -## @noindent -## in which @var{x} is a vector and @var{g} is a vector. -## -## When supplied, the Hessian function must be of the form -## -## @example -## @var{h} = hessian (@var{x}) -## @end example +## When supplied, the gradient function @code{@var{phi}@{2@}} must accept +## one vector argument and return a vector. When supplifed, the Hessian +## function @code{@var{phi}@{3@}} must accept one vector argument and +## return a matrix. ## -## @noindent -## in which @var{x} is a vector and @var{h} is a matrix. -## -## The third and fourth arguments are function handles pointing to -## functions that compute the equality constraints and the inequality -## constraints, respectively. -## -## If the problem does not have equality (or inequality) constraints, -## then use an empty matrix ([]) for @var{cef} (or @var{cif}). -## -## When supplied, the equality and inequality constraint functions must be -## of the form -## -## @example -## @var{r} = f (@var{x}) -## @end example -## -## @noindent -## in which @var{x} is a vector and @var{r} is a vector. +## The third and fourth arguments @var{g} and @var{h} are function +## handles pointing to functions that compute the equality constraints +## and the inequality constraints, respectively. If the problem does +## not have equality (or inequality) constraints, then use an empty +## matrix ([]) for @var{g} (or @var{h}). When supplied, these equality +## and inequality constraint functions must accept one vector argument +## and return a vector. ## ## The third and fourth arguments may also be 2-element cell arrays of ## function handles. The first element should point to the constraint @@ -137,19 +109,20 @@ ## @end example ## ## @end ifnottex -## The fifth and sixth arguments contain lower and upper bounds -## on @var{x}. These must be consistent with the equality and inequality -## constraints @var{g} and @var{h}. If the arguments are vectors then -## @var{x}(i) is bound by @var{lb}(i) and @var{ub}(i). A bound can also -## be a scalar in which case all elements of @var{x} will share the same -## bound. If only one bound (lb, ub) is specified then the other will -## default to (-@var{realmax}, +@var{realmax}). +## The fifth and sixth arguments, @var{lb} and @var{ub}, contain lower +## and upper bounds on @var{x}. These must be consistent with the +## equality and inequality constraints @var{g} and @var{h}. If the +## arguments are vectors then @var{x}(i) is bound by @var{lb}(i) and +## @var{ub}(i). A bound can also be a scalar in which case all elements +## of @var{x} will share the same bound. If only one bound (lb, ub) is +## specified then the other will default to (-@var{realmax}, +## +@var{realmax}). ## -## The seventh argument specifies the maximum number of iterations. -## The default value is 100. +## The seventh argument @var{maxiter} specifies the maximum number of +## iterations. The default value is 100. ## -## The eighth argument specifies the tolerance for the stopping criteria. -## The default value is @code{sqrt(eps)}. +## The eighth argument @var{tol} specifies the tolerance for the +## stopping criteria. The default value is @code{sqrt(eps)}. ## ## The value returned in @var{info} may be one of the following: ## @@ -163,7 +136,7 @@ ## @ifnottex ## delta @var{x}, ## @end ifnottex -## is less than @code{tol * norm (x)}. +## is less than @code{@var{tol} * norm (x)}. ## ## @item 102 ## The BFGS update failed. diff -r f26ea04b5356 -r 571557ddabb9 scripts/plot/private/__errplot__.m --- a/scripts/plot/private/__errplot__.m Mon Oct 03 12:48:15 2011 -0400 +++ b/scripts/plot/private/__errplot__.m Mon Oct 03 11:01:10 2011 -0700 @@ -31,7 +31,7 @@ print_usage (); endif - [fmt, key] = __pltopt__ ("__errplot__", fstr); + [fmt, valid] = __pltopt__ ("__errplot__", fstr); [len, nplots] = size (varargin{1}); h = []; @@ -74,7 +74,7 @@ switch (numel(varargin)) case 2 ydata = varargin{1}(:,i); - xdata = 1:numel(ydata); + xdata = 1:numel (ydata); if (strcmp (ifmt, "xerr") || strcmp (ifmt, "box")) xldata = varargin{2}(:,i); xudata = ldata; @@ -86,12 +86,12 @@ xldata = []; xudata = []; else - error ("errorbar: 2 column errorplot is only valid or xerr or yerr"); + error ("errorbar: 2 column errorplot is only valid for xerr or yerr"); endif case 3 if (strcmp (ifmt, "boxxy") || strcmp (ifmt, "xyerr")) ydata = varargin{1}(:,i); - xdata = 1:numel(ydata); + xdata = 1:numel (ydata); xldata = varargin{2}(:,i); xudata = xldata; ldata = varargin{3}(:,i); @@ -146,7 +146,7 @@ error ("errorbar: error plot with 6 columns only valid for boxxy and xyerr"); endif otherwise - error ("errorbar: error plot requires 2, 3, 4 or 6 arguments"); + error ("errorbar: error plot requires 2, 3, 4, or 6 arguments"); endswitch addproperty ("xdata", hg, "data", xdata(:)); @@ -193,6 +193,34 @@ endfor + ## Process legend key + if (! isempty (fmt.key)) + hlegend = []; + fkids = get (gcf(), "children"); + for i = 1 : numel (fkids) + if (ishandle (fkids(i)) && strcmp (get (fkids(i), "type"), "axes") + && (strcmp (get (fkids(i), "tag"), "legend"))) + udata = get (fkids(i), "userdata"); + if (! isempty (intersect (udata.handle, gca ()))) + hlegend = fkids (i); + break; + endif + endif + endfor + + if (isempty (hlegend)) + hlgnd = []; + tlgnd = {}; + else + [hlgnd, tlgnd] = __getlegenddata__ (hlegend); + endif + + hlgnd(end+1) = hg; + tlgnd(end+1) = fmt.key; + + legend (gca(), hlgnd, tlgnd); + end + endfunction function [xdata, ydata] = errorbar_data (xdata, ydata, ldata, udata, @@ -259,8 +287,10 @@ else error ("errorbar: valid error bar types are xerr, yerr, boxxy, and xyerr"); endif + xdata = xdata.'(:); ydata = ydata.'(:); + endfunction function update_props (hg, dummy, hl) diff -r f26ea04b5356 -r 571557ddabb9 scripts/plot/private/__getlegenddata__.m --- a/scripts/plot/private/__getlegenddata__.m Mon Oct 03 12:48:15 2011 -0400 +++ b/scripts/plot/private/__getlegenddata__.m Mon Oct 03 11:01:10 2011 -0700 @@ -26,38 +26,33 @@ text_strings = {}; ca = getfield (get (hlegend, "userdata"), "handle"); kids = []; - for i = 1 : numel (ca) - kids = [kids; get(ca (i), "children")]; + for i = 1:numel (ca) + kids = [kids; get(ca(i), "children")]; endfor - k = numel (kids); - while (k > 0) - typ = get (kids(k), "type"); - while (k > 0 - && ! (strcmp (typ, "line") || strcmp (typ, "surface") - || strcmp (typ, "patch") || strcmp (typ, "hggroup"))) - typ = get (kids(--k), "type"); - endwhile - if (k > 0) - if (strcmp (get (kids(k), "type"), "hggroup")) - hgkids = get (kids(k), "children"); + + for i = numel (kids):-1:1 + typ = get (kids(i), "type"); + if (strcmp (typ, "line") || strcmp (typ, "surface") + || strcmp (typ, "patch") || strcmp (typ, "hggroup")) + + if (strcmp (typ, "hggroup")) + hgkids = get (kids(i), "children"); for j = 1 : length (hgkids) hgobj = get (hgkids (j)); - if (isfield (hgobj, "displayname") - && ! isempty (hgobj.displayname)) + if (isfield (hgobj, "displayname") && ! isempty (hgobj.displayname)) hplots = [hplots, hgkids(j)]; text_strings = {text_strings{:}, hgobj.displayname}; break; endif endfor else - if (! isempty (get (kids (k), "displayname"))) - hplots = [hplots, kids(k)]; - text_strings = {text_strings{:}, get(kids (k), "displayname")}; + if (! isempty (get (kids (i), "displayname"))) + hplots = [hplots, kids(i)]; + text_strings = {text_strings{:}, get(kids (i), "displayname")}; endif endif - if (--k == 0) - break; - endif + endif - endwhile + endfor + endfunction diff -r f26ea04b5356 -r 571557ddabb9 scripts/plot/private/__line__.m --- a/scripts/plot/private/__line__.m Mon Oct 03 12:48:15 2011 -0400 +++ b/scripts/plot/private/__line__.m Mon Oct 03 11:01:10 2011 -0700 @@ -45,8 +45,12 @@ num_data_args = 0; endif + if (num_data_args > 0 && ! size_equal (varargin{1:num_data_args})) + error ("line: number of X, Y, and Z points must be equal"); + endif + if (rem (nvargs - num_data_args, 2) != 0) - print_usage ("line"); + error ("line: invalid number of PROPERTY / VALUE pairs"); endif other_args = {}; diff -r f26ea04b5356 -r 571557ddabb9 scripts/signal/fftshift.m --- a/scripts/signal/fftshift.m Mon Oct 03 12:48:15 2011 -0400 +++ b/scripts/signal/fftshift.m Mon Oct 03 11:01:10 2011 -0700 @@ -24,13 +24,15 @@ ## center of the vector or matrix. ## ## If @var{x} is a vector of @math{N} elements corresponding to @math{N} -## time samples spaced of @math{Dt} each, then @code{fftshift (fft -## (@var{x}))} corresponds to frequencies +## time samples spaced by @math{dt}, then +## @code{fftshift (fft (@var{x}))} corresponds to frequencies ## ## @example -## f = ((1:N) - ceil(N/2)) / N / Dt +## f = [ -(ceil((N-1)/2):-1:1)*df 0 (1:floor((N-1)/2))*df ] ## @end example ## +## where @math{df} = 1 / @math{dt}. +## ## If @var{x} is a matrix, the same holds for rows and columns. If ## @var{x} is an array, then the same holds along each dimension. ## @@ -44,15 +46,13 @@ function retval = fftshift (x, dim) - retval = 0; - if (nargin != 1 && nargin != 2) print_usage (); endif if (nargin == 2) - if (!isscalar (dim)) - error ("fftshift: dimension must be an integer scalar"); + if (! (isscalar (dim) && dim > 0 && dim == fix (dim))) + error ("fftshift: dimension DIM must be a positive integer"); endif nd = ndims (x); sz = size (x); @@ -82,6 +82,7 @@ endfunction + %!test %! x = [0:7]; %! y = fftshift (x); diff -r f26ea04b5356 -r 571557ddabb9 src/DLD-FUNCTIONS/schur.cc --- a/src/DLD-FUNCTIONS/schur.cc Mon Oct 03 12:48:15 2011 -0400 +++ b/src/DLD-FUNCTIONS/schur.cc Mon Oct 03 11:01:10 2011 -0700 @@ -60,8 +60,10 @@ DEFUN_DLD (schur, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {@var{S} =} schur (@var{A})\n\ +@deftypefnx {Loadable Function} {@var{S} =} schur (@var{A}, \"real\")\n\ @deftypefnx {Loadable Function} {@var{S} =} schur (@var{A}, \"complex\")\n\ -@deftypefnx {Loadable Function} {[@var{U}, @var{S}] =} schur (@var{A}, @var{opt})\n\ +@deftypefnx {Loadable Function} {@var{S} =} schur (@var{A}, @var{opt})\n\ +@deftypefnx {Loadable Function} {[@var{U}, @var{S}] =} schur (@var{A}, @dots{})\n\ @cindex Schur decomposition\n\ Compute the Schur@tie{}decomposition of @var{A}\n\ @tex\n\ @@ -104,7 +106,8 @@ @end ifnottex\n\ blocks, when appropriate) are the eigenvalues of @var{A} and @var{S}.\n\ \n\ -A complex decomposition may be forced by passing \"complex\" as @var{opt}.\n\ +The default for real matrices is a real Schur@tie{}decomposition.\n\ +A complex decomposition may be forced by passing the flag \"complex\".\n\ \n\ The eigenvalues are optionally ordered along the diagonal according to\n\ the value of @var{opt}. @code{@var{opt} = \"a\"} indicates that all\n\ @@ -150,7 +153,11 @@ bool force_complex = false; - if (ord == "complex") + if (ord == "real") + { + ord = std::string (); + } + else if (ord == "complex") { force_complex = true; ord = std::string ();