Notes on CR and west0479

My post a few days ago, Gil Strang and the CR Matrix Factorization, generated a lot of email. Here is the resulting follow-up to that post.

Contents

CR via backslash

Suppose A is rank deficient and that its leading columns, C, reveals its rank. Then the factorization

C*R = A

is a systen of linear, overdetermined equations for the elements of R. How do you solve such systems? "Divide" both sides by C.

R = C\A

Backslash will find the least squares solution to this overdetermined system. If A actually does have such a factorization, the least squares solution will be an exact solution and the resulting R will be in what we could call the " canonical reduced row echelon form" of A. It will have the zero rows deleted and the identity matrix in the leading rows and columns.

When the elements of A are integers, you can remove the roundoff fuzz and recover them with

round(C*R)

If you don't know the rank, you can use backslash in a loop.

    type cr_backslash
function [C,R] = cr_backslash(A)
    for r = 1:size(A,2)
        C = A(:,1:r);
        R = C\A;
        if round(C*R) == A
            break
        end
    end
end
 

Here's an example

   A = [ 0  3 12  6
         1  2  9  7
         2  1  6  8
         3  0  3  9 ];

   [C,R] = cr_backslash(A)

   round(C*R)
C =

     0     3
     1     2
     2     1
     3     0


R =

    1.0000    0.0000    1.0000    3.0000
    0.0000    1.0000    4.0000    2.0000


ans =

     0     3    12     6
     1     2     9     7
     2     1     6     8
     3     0     3     9

cr_backslash works on the magic squares.

    small_fig
    for n = 1:31
        M = magic(n);
        [C,R] = cr_backslash(M);
        r(n) = size(C,2);
    end
    bar(r)
    title('rank(magic(n))')
    xlabel('n')

CR explained

Iain Duff suggested that I offer more explanation for the plots of C and R generated by magic squares.

Here is code for magic(n) when n is a multiple of four.

  J = repmat([0 1 1 0],n/4)
  K = (J' == J)
  A = reshape(1:n^2,n,n)';
  B = A;
  A(K) = 0
  B(~K) = 0;
  B = rot90(B,2)
  M = A + B

Here is the output when n = 8 with zeros replaced by dots. The pattern in K is responsible for the patterns we will see in plots of C and R.

J =
   .     1     1     .     .     1     1     .
K =
   1     .     .     1     1     .     .     1
   .     1     1     .     .     1     1     .
   .     1     1     .     .     1     1     .
   1     .     .     1     1     .     .     1
   1     .     .     1     1     .     .     1
   .     1     1     .     .     1     1     .
   .     1     1     .     .     1     1     .
   1     .     .     1     1     .     .     1
A =
   .     2     3     .     .     6     7     .
   9     .     .    12    13     .     .    16
  17     .     .    20    21     .     .    24
   .    26    27     .     .    30    31     .
   .    34    35     .     .    38    39     .
  41     .     .    44    45     .     .    48
  49     .     .    52    53     .     .    56
   .    58    59     .     .    62    63     .
B =
  64     .     .    61    60     .     .    57
   .    55    54     .     .    51    50     .
   .    47    46     .     .    43    42     .
  40     .     .    37    36     .     .    33
  32     .     .    29    28     .     .    25
   .    23    22     .     .    19    18     .
   .    15    14     .     .    11    10     .
   8     .     .     5     4     .     .     1
M =
  64     2     3    61    60     6     7    57
   9    55    54    12    13    51    50    16
  17    47    46    20    21    43    42    24
  40    26    27    37    36    30    31    33
  32    34    35    29    28    38    39    25
  41    23    22    44    45    19    18    48
  49    15    14    52    53    11    10    56
   8    58    59     5     4    62    63     1

C is the first three columns of M and R is the canonical reduced row echelon form of M.

C =
  64     2     3
   9    55    54
  17    47    46
  40    26    27
  32    34    35
  41    23    22
  49    15    14
   8    58    59

R =

   1     0     0     1     1     0     0     1
   0     1     0     3     4    -3    -4     7
   0     0     1    -3    -4     4     5    -7

Columns 2 and 3 of C differ by +1 or -1, so in plot(C) they are on top of each other in the dark blue. Column 1, in blue green, complements the other two columns.

Row 1 of R is just 0 or 1; it is the light blue in plot(R ), The other two rows of R complement each other.

Here are the plots when n = 24.

west0479 explained

Art Westerberg retired from Carnegie Mellon in 2003, but that does't stop him from explaining the chemical engineering going on in west0479.

West0479 is from a model of a distillation column. Such a device is a stack of repeated units called trays. The fingerprints of these trays are all over a spy plot of west0479. The modeling equations for a tray only reference variables within the tray. To create a column, one "connects" the outflow and inflow of fluid and vapor from each tray to the tray above it and the one below it. This creates the equations that have just two nonzero coefficients, a +1 or -1 and a smaller value.

rref is not a sparse solver; it just plows across the matrix. When its drop tolerance, tol, is larger than one, the connections are ignored, resulting in an echelon form that is sparser than the original, and a lousy approximation. When tol is smaller than one, the vital connections are included, but the fill-in effectively connects each tray to all the other trays. This also results in a poor approximation.

west0479 iterated

John Gilbert tells us that today systems of equations involving west0479 are readily solved by direct methods, but the eleven orders of magnitude variation in the coefficients causes iterative methods to struggle.

west0479 inspires

Tim Davis is inspired by west0479. A "favicon" is a small icon for a website. See the one in the upper left hand corner of this old web page: Tim's Matrices. Be sure to see Tim's Gallery, the Horror Matrix at Tim's Poetry, and Cleve's Corner.




Published with MATLAB® R2020a

|
  • print

댓글

댓글을 남기려면 링크 를 클릭하여 MathWorks 계정에 로그인하거나 계정을 새로 만드십시오.