Mercurial > octave-nkf
diff liboctave/COLAMD/colamd.m @ 5164:57077d0ddc8e
[project @ 2005-02-25 19:55:24 by jwe]
author | jwe |
---|---|
date | Fri, 25 Feb 2005 19:55:28 +0000 |
parents | |
children | 49ff3dd744ee |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/COLAMD/colamd.m Fri Feb 25 19:55:28 2005 +0000 @@ -0,0 +1,109 @@ +function [p,stats] = colamd (S, knobs) +%COLAMD Column approximate minimum degree permutation. +% P = COLAMD (S) returns the column approximate minimum degree permutation +% vector for the sparse matrix S. For a non-symmetric matrix S, S (:,P) +% tends to have sparser LU factors than S. The Cholesky factorization of +% S (:,P)' * S (:,P) also tends to be sparser than that of S'*S. COLAMD +% tends to be faster than COLMMD and tends to return a better ordering. +% +% See also COLMMD, COLPERM, SPPARMS, SYMAMD, SYMMMD, SYMRCM. +% +% Usage: P = colamd (S) +% P = colamd (S, knobs) +% [P, stats] = colamd (S) +% [P, stats] = colamd (S, knobs) +% +% knobs is an optional two-element input vector. If S is m-by-n, then +% rows with more than (knobs (1))*n entries are ignored. Columns with +% more than (knobs (2))*m entries are removed prior to ordering, and +% ordered last in the output permutation P. If the knobs parameter is not +% present, then 0.5 is used instead, for both knobs (1) and knobs (2). +% knobs (3) controls the printing of statistics and error messages. +% +% stats is an optional 20-element output vector that provides data about the +% ordering and the validity of the input matrix S. Ordering statistics are +% in stats (1:3). stats (1) and stats (2) are the number of dense or empty +% rows and columns ignored by COLAMD and stats (3) is the number of +% garbage collections performed on the internal data structure used by +% COLAMD (roughly of size 2.2*nnz(S) + 4*m + 7*n integers). +% +% MATLAB built-in functions are intended to generate valid sparse matrices, +% with no duplicate entries, with ascending row indices of the nonzeros +% in each column, with a non-negative number of entries in each column (!) +% and so on. If a matrix is invalid, then COLAMD may or may not be able +% to continue. If there are duplicate entries (a row index appears two or +% more times in the same column) or if the row indices in a column are out +% of order, then COLAMD can correct these errors by ignoring the duplicate +% entries and sorting each column of its internal copy of the matrix S (the +% input matrix S is not repaired, however). If a matrix is invalid in other +% ways then COLAMD cannot continue, an error message is printed, and no +% output arguments (P or stats) are returned. COLAMD is thus a simple way +% to check a sparse matrix to see if it's valid. +% +% stats (4:7) provide information if COLAMD was able to continue. The +% matrix is OK if stats (4) is zero, or 1 if invalid. stats (5) is the +% rightmost column index that is unsorted or contains duplicate entries, +% or zero if no such column exists. stats (6) is the last seen duplicate +% or out-of-order row index in the column index given by stats (5), or zero +% if no such row index exists. stats (7) is the number of duplicate or +% out-of-order row indices. +% +% stats (8:20) is always zero in the current version of COLAMD (reserved +% for future use). +% +% The ordering is followed by a column elimination tree post-ordering. +% +% Authors: +% +% The authors of the code itself are Stefan I. Larimore and Timothy A. +% Davis (davis@cise.ufl.edu), University of Florida. The algorithm was +% developed in collaboration with John Gilbert, Xerox PARC, and Esmond +% Ng, Oak Ridge National Laboratory. +% +% Date: +% +% September 8, 2003. Version 2.3. +% +% Acknowledgements: +% +% This work was supported by the National Science Foundation, under +% grants DMS-9504974 and DMS-9803599. + +% Notice: +% +% Copyright (c) 1998-2003 by the University of Florida. +% All Rights Reserved. +% +% See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c +% file) for the License. +% +% Availability: +% +% The colamd/symamd library is available at +% +% http://www.cise.ufl.edu/research/sparse/colamd/ +% + +%------------------------------------------------------------------------------- +% Perform the colamd ordering: +%------------------------------------------------------------------------------- + +if (nargout <= 1 & nargin == 1) + p = colamdmex (S) ; +elseif (nargout <= 1 & nargin == 2) + p = colamdmex (S, knobs) ; +elseif (nargout == 2 & nargin == 1) + [p, stats] = colamdmex (S) ; +elseif (nargout == 2 & nargin == 2) + [p, stats] = colamdmex (S, knobs) ; +else + error ('colamd: incorrect number of input and/or output arguments') ; +end + +%------------------------------------------------------------------------------- +% column elimination tree post-ordering: +%------------------------------------------------------------------------------- + +[ignore, q] = sparsfun ('coletree', S (:,p)) ; +p = p (q) ; +