octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chageset]: Add the spaugment function


From: David Bateman
Subject: [Chageset]: Add the spaugment function
Date: Wed, 02 Apr 2008 19:12:46 +0200
User-agent: Thunderbird 2.0.0.12 (X11/20080306)

Another easy function to implement. The help string and the example took
longer to write :-)

D.

-- 
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

# HG changeset patch
# User David Bateman <address@hidden>
# Date 1207154950 -7200
# Node ID 05a11ba8bfe58e9b8c8dcad9a44785acbde9a130
# Parent  08b6dd8d9187e122924617bc401d915cd17c89c1
Add the spaugment function

diff --git a/doc/ChangeLog b/doc/ChangeLog
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@ 2008-03-26  Rafael Laboissiere  <rafael@
+2008-04-02  David Bateman  <address@hidden>
+
+       * interpreter/sparse.txi: Document spaugment.
+
 2008-03-26  Rafael Laboissiere  <address@hidden>
 
        * interpreter/mkoctfile.1: Remove spurious whitespace before macros
diff --git a/doc/interpreter/sparse.txi b/doc/interpreter/sparse.txi
--- a/doc/interpreter/sparse.txi
+++ b/doc/interpreter/sparse.txi
@@ -474,7 +474,7 @@ used.
 
 @item Linear algebra:
   @dfn{matrix_type}, @dfn{normest}, @dfn{condest}, @dfn{sprank}
address@hidden @dfn{spaugment}
+  @dfn{spaugment}
 @c @dfn{eigs}, @dfn{svds} but these are in octave-forge for now
 
 @item Iterative techniques:
@@ -824,6 +824,11 @@ used with care.
 @DOCSTRING(sprank)
 
 @DOCSTRING(symbfact)
+
+For non square matrices, the user can also utilize the @code{spaugment}
+function to find a least squares solution to a linear equation.
+
address@hidden(spaugment)
 
 @node Iterative Techniques, Real Life Example, Sparse Linear Algebra, Sparse 
Matrices
 @section Iterative Techniques applied to sparse matrices
diff --git a/scripts/ChangeLog b/scripts/ChangeLog
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,8 @@ 2008-04-01  Julian Schnidder  <j.schnidd
+2008-04-02  David Bateman  <address@hidden>
+
+       * sparse/spaugment.m: New function
+       * sparse/Makefile.in (SOURCES): Add it here.
+       
 2008-04-01  Julian Schnidder  <address@hidden>
 
        * miscellaneous/perl.m: New function.
diff --git a/scripts/sparse/Makefile.in b/scripts/sparse/Makefile.in
--- a/scripts/sparse/Makefile.in
+++ b/scripts/sparse/Makefile.in
@@ -33,8 +33,8 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_DATA = @INSTALL_DATA@
 
 SOURCES = colperm.m etreeplot.m gplot.m nonzeros.m normest.m \
-  pcg.m pcr.m spalloc.m spconvert.m spdiags.m speye.m spfun.m \
-  sphcat.m spones.m sprand.m sprandn.m sprandsym.m spstats.m \
+  pcg.m pcr.m spalloc.m spaugment.m spconvert.m spdiags.m speye.m \
+  spfun.m sphcat.m spones.m sprand.m sprandn.m sprandsym.m spstats.m \
   spvcat.m spy.m treeplot.m
 
 DISTFILES = $(addprefix $(srcdir)/, Makefile.in $(SOURCES))
diff --git a/scripts/sparse/spaugment.m b/scripts/sparse/spaugment.m
new file mode 100644
--- /dev/null
+++ b/scripts/sparse/spaugment.m
@@ -0,0 +1,97 @@
+## Copyright (C) 2008  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 3 of the License, 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, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} address@hidden =} spaugment (@var{a}, @var{c})
+## Creates the augmented matrix of @var{a}. This is given by
+##
+## @example
+## address@hidden * eye(@var{m}, @var{m}),@var{a}; @var{a}', zeros(@var{n},
+## @var{n})]
+## @end example
+##
+## @noindent
+## This is related to the leasted squared solution of 
+## @address@hidden \\ @var{b}}, by
+## 
+## @example
+## @var{s} * [ @var{r} / @var{c}; x] = address@hidden, zeros(@var{n},
+## columns(@var{b})]
+## @end example
+##
+## @noindent
+## where @var{r} is the residual error
+##
+## @example
+## @var{r} = @var{b} - @var{a} * @var{x}
+## @end example
+##
+## As the matrix @var{s} is symmetric indefinite it can be factorized
+## with @code{lu}, and the minimum norm solution can therefore be found
+## without the need for a @code{qr} factorization. As the residual
+## error will be @code{zeros (@var{m}, @var{m})} for under determined
+## problems, and example can be 
+##
+## @example
+## @group
+## m = 11; n = 10; mn = max(m ,n);
+## a = spdiags ([ones(mn,1), 10*ones(mn,1), -ones(mn,1)],[-1,0,1], m, n);
+## x0 = a \ ones (m,1);
+## s = spaugment (a);
+## [L, U, P, Q] = lu (s);
+## x1 = Q * (U \ (L \ (P  * [ones(m,1); zeros(n,1)])));
+## x1 = x1(end - n + 1 : end);
+## @end group
+## @end example
+##
+## To find the solution of an overdetermined problem needs an estimate
+## of the residual error @var{r} and so it is more complex to formulate
+## a minimum norm solution using the @code{spaugment} function.
+##
+## In general the left division operator is more stable and faster than
+## using the @code{spaugment} function.
+## @end deftypefn
+
+function s = spaugment (a, c)
+  if (nargin < 2)
+    if (issparse (a))
+      c = max (max (abs (a))) / 1000;
+    else
+      if (ndims (a) != 2)
+       error ("spaugment: expecting 2-dimenisional matrix")
+      else
+       c = max (abs (a(:))) / 1000;
+      endif
+    endif
+  elseif (!isscalar (c))
+    error ("spaugment: c must be a scalar");
+  endif
+
+  [m, n] = size (a);
+  s = [ c * speye(m, m), a; a', sparse(n, n)];
+endfunction
+
+%!test
+%! m = 11; n = 10; mn = max(m ,n);
+%! a = spdiags ([ones(mn,1), 10*ones(mn,1), -ones(mn,1)],[-1,0,1], m, n);
+%! x0 = a \ ones (m,1);
+%! s = spaugment (a);
+%! [L, U, P, Q] = lu (s);
+%! x1 = Q * (U \ (L \ (P  * [ones(m,1); zeros(n,1)])));
+%! x1 = x1(end - n + 1 : end);
+%! assert (x1, x0, 1e-10)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]