Blame view

fvn_sparse/UMFPACK/MATLAB/umfpack_solve.m 2.29 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
  function x = umfpack_solve (arg1, op, arg2, Control)
  %UMFPACK_SOLVE x = A\b or x = b/A
  %
  % Example:
  %   x = umfpack_solve (A, '\', b, Control)
  %   x = umfpack_solve (b, '/', A, Control)
  %
  % Computes x = A\b, or b/A, where A is square.  Uses UMFPACK if A is sparse.
  % The Control argument is optional.
  %
  % See also umfpack, umfpack2, umfpack_make, umfpack_details, umfpack_report,
  % and umfpack_simple.
  
  % Copyright 1995-2007 by Timothy A. Davis.
  
  %-------------------------------------------------------------------------------
  % check inputs and get default control parameters
  %-------------------------------------------------------------------------------
  
  if (op == '\')
      A = arg1 ;
      b = arg2 ;
  elseif (op == '/')
      A = arg2 ;
      b = arg1 ;
  else
      help umfack_solve
      error ('umfpack_solve:  unrecognized operator') ;
  end
  
  [m n] = size (A) ;
  if (m ~= n)
      help umfpack_solve
      error ('umfpack_solve:  A must be square') ;
  end
  
  [m1 n1] = size (b) ;
  if ((op == '\' & n ~= m1) | (op == '/' & n1 ~= m))			    %#ok
      help umfpack_solve
      error ('umfpack_solve:  b has the wrong dimensions') ;
  end
  
  if (nargin < 4)
      Control = umfpack2 ;
  end
  
  %-------------------------------------------------------------------------------
  % solve the system
  %-------------------------------------------------------------------------------
  
  if (op == '\')
  
      if (~issparse (A))
  
  	% A is not sparse, so just use MATLAB
  	x = A\b ;
  
      elseif (n1 == 1 & ~issparse (b))					    %#ok
  
  	% the UMFPACK '\' requires b to be a dense column vector
  	x = umfpack2 (A, '\', b, Control) ;
  
      else
  
  	% factorize with UMFPACK and do the forward/back solves in MATLAB
  	[L, U, P, Q, R] = umfpack2 (A, Control) ;
  	x = Q * (U \ (L \ (P * (R \ b)))) ;
  
      end
  
  else
  
      if (~issparse (A))
  
  	% A is not sparse, so just use MATLAB
  	x = b/A ;
  
      elseif (m1 == 1 & ~issparse (b))					    %#ok
  
  	% the UMFPACK '\' requires b to be a dense column vector
  	x = umfpack2 (b, '/', A, Control) ;
  
      else
  
  	% factorize with UMFPACK and do the forward/back solves in MATLAB
  	% this mimics the behavior of x = b/A, except for the row scaling
  	[L, U, P, Q, R] = umfpack2 (A.', Control) ;
  	x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ;
  
  	% an alternative method:
  	% [L, U, P, Q, r] = umfpack2 (A, Control) ;
  	% x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ;
  
      end
  
  end