# HG changeset patch # User Rik # Date 1238218514 25200 # Node ID 089bd295e4f7a04b08ceb5102d6280f2277cb16d # Parent 1bf0ce0930be5d6b10a0cb7251cc0c817d8dcb64# Parent e15f4197d9072c545d8baede60f5eb44d8ea5f73 Documentation cleanup merge diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-03-27 Jaroslav Hajek + + * aclocal.m4 (OCTAVE_CMATH_FUNC): Add missing AC_LANG_POP. + * configure.in: Enclose string in quotes. + 2009-03-23 Jaroslav Hajek * NEWS: More updates. diff --git a/aclocal.m4 b/aclocal.m4 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1318,6 +1318,7 @@ [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_CMATH_[]AS_TR_CPP($1)F,1,[Define if provides float variant of $1])], [AC_MSG_RESULT([no])]) +AC_LANG_POP(C++) ]) dnl Check whether fast signed integer arithmetics using bit tricks diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -266,7 +266,7 @@ if test "$have_x"; then AC_DEFINE(HAVE_X_WINDOWS, 1, [Define if you have X11]) - if test $x_includes != "NONE"; then + if test "$x_includes" != "NONE"; then X11_INCFLAGS="$x_includes" fi AC_SUBST(X11_INCFLAGS) diff --git a/doc/ChangeLog b/doc/ChangeLog --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,7 @@ +2009-03-27 Jaroslav Hajek + + * interpreter/diagperm.txi: Mention mixing with sparse matrices. + 2009-03-25 John W. Eaton * interpreter/munge-texi.cc (process_texi_input_file): diff --git a/doc/interpreter/diagperm.txi b/doc/interpreter/diagperm.txi --- a/doc/interpreter/diagperm.txi +++ b/doc/interpreter/diagperm.txi @@ -258,6 +258,12 @@ happens to be diagonal (an is thus not a special object) is of course treated normally. +Multiplication and division by diagonal matrices works efficiently also when +combined with sparse matrices, i.e. @code{D*S}, where @var{D} is a diagonal +matrix and @var{S} is a sparse matrix scales the rows of the sparse matrix and +returns a sparse matrix. The expressions @code{S*D}, @code{D\S}, @code{S/D} work +analogically. + If @var{D1} and @var{D2} are both diagonal matrices, then the expressions @example D1 + D2 @@ -320,6 +326,12 @@ flag internally, and thus the choice between the two above equivalent expressions for inverse permuting is completely up to the user's taste. +Multiplication and division by permutation matrices works efficiently also when +combined with sparse matrices, i.e. @code{P*S}, where @var{P} is a permutation +matrix and @var{S} is a sparse matrix permutes the rows of the sparse matrix and +returns a sparse matrix. The expressions @code{S*P}, @code{P\S}, @code{S/P} work +analogically. + Two permutation matrices can be multiplied or divided (if their sizes match), performing a composition of permutations. Also a permutation matrix can be indexed by a permutation vector (or two vectors), giving again a permutation matrix. @@ -351,6 +363,8 @@ @dfn{abs}, @dfn{real}, @dfn{imag}, @dfn{conj}, @dfn{sqrt}. A diagonal matrix can also be returned from the @dfn{balance} and @dfn{svd} functions. +The @dfn{sparse} function will convert a diagonal matrix efficiently to a +sparse matrix. @node Permutation Matrix Functions @subsection Permutation Matrix Functions @@ -362,6 +376,11 @@ A permutation matrix can also be returned from the built-in functions @dfn{lu} and @dfn{qr}, if a pivoted factorization is requested. +The @dfn{sparse} function will convert a permutation matrix efficiently to a +sparse matrix. +The @dfn{find} function will also work efficiently with a permutation matrix, +making it possible to conveniently obtain the permutation indices. + @node Example Codes @section Some Examples of Usage diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -2546,6 +2546,21 @@ } } + // Fixup return dimensions, for Matlab compatibility. + // find(zeros(0,0)) -> zeros(0,0) + // find(zeros(1,0)) -> zeros(1,0) + // find(zeros(0,1)) -> zeros(0,1) + // find(zeros(0,X)) -> zeros(0,1) + // find(zeros(1,1)) -> zeros(0,0) !!!! WHY? + // find(zeros(0,1,0)) -> zeros(0,0) + // find(zeros(0,1,0,1)) -> zeros(0,0) etc + + if ((numel () == 1 && retval.is_empty ()) + || (rows () == 0 && dims ().numel (1) == 0)) + retval.dimensions = dim_vector (); + else if (rows () == 1 && ndims () == 2) + retval.dimensions = dim_vector (1, retval.length ()); + return retval; } diff --git a/liboctave/Array.h b/liboctave/Array.h --- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -628,6 +628,7 @@ return result; } + template friend class Array; }; #endif diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,13 @@ +2009-03-26 Jaroslav Hajek + + * Array.cc (Array::find): Reshape result for Matlab compatibility. + * Array.h (Array): Add friend template declaration. + +2009-03-27 Jaroslav Hajek + + * idx-vector.cc (idx_vector::idx_vector_rep::idx_vector_rep (const + Array&): Use more M*b-compatible behaviour. + 2009-03-26 Jaroslav Hajek * dim-vector.h (dim_vector::numel): Add optional argument, simplify. diff --git a/liboctave/idx-vector.cc b/liboctave/idx-vector.cc --- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -295,10 +295,11 @@ for (octave_idx_type i = 0, l = bnda.numel (); i < l; i++) if (bnda.xelem (i)) len++; - dim_vector dv = bnda.dims (); + const dim_vector dv = bnda.dims (); - orig_dims = ((dv.length () == 2 && dv(0) == 1) - ? dim_vector (1, len) : orig_dims = dim_vector (len, 1)); + if (! dv.all_zero ()) + orig_dims = ((dv.length () == 2 && dv(0) == 1) + ? dim_vector (1, len) : dim_vector (len, 1)); if (len != 0) { diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,12 @@ +2009-03-27 Ben Abbott + + * plot/__go_draw_axes__.m: Properly position the title for 3D plots + when using the gnuplot (v4.3+) backend. + +2009-03-27 Jaroslav Hajek + + * linear-algebra/expm.m: Fix order of outputs from balance. + 2009-03-25 Kai Habel * general/gradient.m: Fix calculation for more than two diff --git a/scripts/linear-algebra/expm.m b/scripts/linear-algebra/expm.m --- a/scripts/linear-algebra/expm.m +++ b/scripts/linear-algebra/expm.m @@ -115,12 +115,12 @@ a -= trshift*eye (n); endif ## Balancing. - [p, d, aa] = balance (a); + [d, p, aa] = balance (a); ## FIXME: can we both permute and scale at once? Or should we rather do ## this: ## - ## [p, xx, aa] = balance (a, "noscal"); - ## [xx, d, aa] = balance (aa, "noperm"); + ## [d, xx, aa] = balance (a, "noperm"); + ## [xx, p, aa] = balance (aa, "noscal"); [f, e] = log2 (norm (aa, "inf")); s = max (0, e); s = min (s, 1023); diff --git a/scripts/plot/__go_draw_axes__.m b/scripts/plot/__go_draw_axes__.m --- a/scripts/plot/__go_draw_axes__.m +++ b/scripts/plot/__go_draw_axes__.m @@ -100,9 +100,14 @@ else fontspec = sprintf ("font \"%s,%d\"", f, s); endif - fprintf (plot_stream, "set title \"%s\" %s %s;\n", + fprintf (plot_stream, "set title \"%s\" %s %s", undo_string_escapes (tt), fontspec, __do_enhanced_option__ (enhanced, t)); + if (nd == 3) + fprintf (plot_stream, " offset screen 0, screen %.3f;\n", pos(4)/5); + else + fprintf (plot_stream, ";\n"); + endif endif endif diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2009-03-27 Jaroslav Hajek + + * DLD-FUNCTIONS/balance.cc (Fbalance): Fix order of output args. + +2009-03-26 Jaroslav Hajek + + * DLD-FUNCTIONS/find.cc + (find_nonzero_elem_idx (const Array&, ...)): Move dimensions + fixup to liboctave. + 2009-03-26 Jaroslav Hajek * DLD-FUNCTIONS/find.cc diff --git a/src/DLD-FUNCTIONS/balance.cc b/src/DLD-FUNCTIONS/balance.cc --- a/src/DLD-FUNCTIONS/balance.cc +++ b/src/DLD-FUNCTIONS/balance.cc @@ -51,7 +51,7 @@ "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {@var{aa} =} balance (@var{a}, @var{opt})\n\ @deftypefnx {Loadable Function} {[@var{dd}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ -@deftypefnx {Loadable Function} {[@var{p}, @var{d}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ +@deftypefnx {Loadable Function} {[@var{d}, @var{p}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ @deftypefnx {Loadable Function} {[@var{cc}, @var{dd}, @var{aa}, @var{bb}] =} balance (@var{a}, @var{b}, @var{opt})\n\ \n\ Compute @code{aa = dd \\ a * dd} in which @code{aa} is a matrix whose\n\ @@ -62,7 +62,7 @@ eigenvalue calculation are typically improved by balancing first.\n\ \n\ If two output values are requested, @code{balance} returns \n\ -the permutation @code{p} and the diagonal @code{d} separately as vectors. \n\ +the diagonal @code{d} and the permutation @code{p} separately as vectors. \n\ In this case, @code{dd = eye(n)(p,:) * diag (d)}, where @code{n} is the matrix \n\ size. \n\ \n\ @@ -169,8 +169,8 @@ else { retval(2) = result.balanced_matrix (); - retval(1) = result.scaling_vector (); - retval(0) = result.permuting_vector (); + retval(0) = result.scaling_vector (); + retval(1) = result.permuting_vector (); } } @@ -188,8 +188,8 @@ else { retval(2) = result.balanced_matrix (); - retval(1) = result.scaling_vector (); - retval(0) = result.permuting_vector (); + retval(0) = result.scaling_vector (); + retval(1) = result.permuting_vector (); } } } @@ -209,8 +209,8 @@ else { retval(2) = result.balanced_matrix (); - retval(1) = result.scaling_vector (); - retval(0) = result.permuting_vector (); + retval(0) = result.scaling_vector (); + retval(1) = result.permuting_vector (); } } else @@ -227,8 +227,8 @@ else { retval(2) = result.balanced_matrix (); - retval(1) = result.scaling_vector (); - retval(0) = result.permuting_vector (); + retval(0) = result.scaling_vector (); + retval(1) = result.permuting_vector (); } } } diff --git a/src/DLD-FUNCTIONS/find.cc b/src/DLD-FUNCTIONS/find.cc --- a/src/DLD-FUNCTIONS/find.cc +++ b/src/DLD-FUNCTIONS/find.cc @@ -49,23 +49,6 @@ else idx = nda.find (); - // Fixup idx dimensions, for Matlab compatibility. - // find(zeros(0,0)) -> zeros(0,0) - // find(zeros(1,0)) -> zeros(1,0) - // find(zeros(0,1)) -> zeros(0,1) - // find(zeros(0,X)) -> zeros(0,1) - // find(zeros(1,1)) -> zeros(0,0) !!!! WHY? - // find(zeros(0,1,0)) -> zeros(0,0) - // find(zeros(0,1,0,1)) -> zeros(0,0) etc - // FIXME: I don't believe this is right. Matlab seems to violate its own docs - // here, because a scalar *is* a row vector. - - if ((nda.numel () == 1 && idx.is_empty ()) - || (nda.rows () == 0 && nda.dims ().numel (1) == 0)) - idx = idx.reshape (dim_vector (0, 0)); - else if (nda.rows () == 1 && nda.ndims () == 2) - idx = idx.reshape (dim_vector (1, idx.length ())); - switch (nargout) { default: