Blame view

fvn_sparse/UMFPACK/MATLAB/lu_normest.m 3.51 KB
422234dc3   daniau   git-svn-id: https...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  function rho = lu_normest (A, L, U)
  %LU_NORMEST estimates norm (L*U-A, 1) without forming L*U-A
  %
  % Example:
  %
  %       rho = lu_normest (A, L, U)
  %
  % which estimates the computation of the 1-norm:
  %
  %       rho = norm (A-L*U, 1)
  %
  % Authors:  William W. Hager, Math Dept., Univ. of Florida
  %       Timothy A. Davis, CISE Dept., Univ. of Florida
  %       Gainesville, FL, 32611, USA.
  %       based on normest1, contributed on November, 1997
  %
  % This code can be quite easily adapted to estimate the 1-norm of any
  % matrix E, where E itself is dense or not explicitly represented, but the
  % computation of E (and E') times a vector is easy.  In this case, our matrix
  % of interest is:
  %
  %       E = A-L*U
  %
  % That is, L*U is the LU factorization of A, where A, L and U
  % are sparse.  This code works for dense matrices A and L too,
  % but it would not be needed in that case, since E is easy to compute
  % explicitly.  For sparse A, L, and U, computing E explicitly would be quite
  % expensive, and thus normest (A-L*U) would be prohibitive.
  %
  % For a detailed description, see Davis, T. A. and Hager, W. W.,
  % Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and
  % Applications, 1999, vol. 20, no. 3, 606-627.
  %
  % See also normest
  
  % The three places that the matrix-vector multiply E*x is used are highlighted.
  % Note that E is never formed explicity.
  
  % Copyright 1995-2007 by William W. Hager and Timothy A. Davis
  
  [m n] = size (A) ;
  
  if (m ~= n)
      % pad A, L, and U with zeros so that they are all square
      if (m < n)
          U = [ U ; (sparse (n-m,n)) ] ;
          L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ;
          A = [ A ; (sparse (n-m,n)) ] ;
      else
          U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ;
          L = [ L , (sparse (m,m-n)) ] ;
          A = [ A , (sparse (m,m-n)) ] ;
      end
  end
  
  [m n] = size (A) ;	    %#ok
  
  notvisited = ones (m, 1) ;  % nonvisited(j) is zero if j is visited, 1 otherwise
  rho = 0 ;    % the global rho
  
  for trial = 1:3 % {
  
     x = notvisited ./ sum (notvisited) ;
     rho1 = 0 ;    % the current rho for this trial
  
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     Ex1 = (A*x) - L*(U*x) ;
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
     rho2 = norm (Ex1, 1) ;
  
     while rho2 > rho1 % {
  
          rho1 = rho2 ;
          y = 2*(Ex1 >= 0) - 1 ;
  
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          z = (A'*y) - U'*(L'*y) ;
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
          [zj, j] = max (abs (z .* notvisited)) ;
          j = j (1) ;
          if (abs (z (j)) > z'*x) % {
              x = zeros (m, 1) ;
              x (j) = 1 ;
              notvisited (j) = 0 ;
          else % } {
              break ;
          end % }
  
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
          Ex1 = (A*x) - L*(U*x) ;
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
          rho2 = norm (Ex1, 1) ;
  
      end % }
  
      rho = max (rho, rho1) ;
  
  end % }