Annotation of researchv10dc/cmd/matlab/doc.n, revision 1.1.1.1

1.1       root        1: .ds xl MATLAB
                      2: .hy 0
                      3: .de pp
                      4: .sp
                      5: .ti +5
                      6: ..
                      7: .de hd
                      8: 'sp 2
                      9: .if \\n%-1 'tl '\*(xl, page %'
                     10: .if !\\n%-1 'tl '\n(mo/\n(dy/\n(yr'
                     11: 'sp 3
                     12: .if !\\n%-1 'ns
                     13: ..
                     14: .de fo
                     15: 'bp
                     16: ..
                     17: .wh 0 hd
                     18: .wh -7 fo
                     19: .tr ` 
                     20: .de xx
                     21: .sp
                     22: .ti -6
                     23: ..
                     24: \      
                     25: .sp 7
                     26: .ce 2
                     27: MATLAB Users' Guide
                     28: February, 1982
                     29: .sp 2
                     30: .ce 3
                     31: Cleve Moler
                     32: Department of Computer Science
                     33: University of New Mexico
                     34: .sp 2
                     35: .in +5
                     36: .ll -5
                     37: ABSTRACT.
                     38: MATLAB is an interactive computer program that serves as a
                     39: convenient "laboratory" for computations involving matrices.
                     40: It provides easy access to matrix software developed by the
                     41: LINPACK and EISPACK projects.
                     42: The program is written in Fortran and is designed to be readily
                     43: installed under any operating system which permits interactive
                     44: execution of Fortran programs.  
                     45: .sp 3
                     46: .ce
                     47: CONTENTS
                     48:    
                     49:      1.  Elementary operations              page  2
                     50:      2.  MATLAB functions                         8
                     51:      3.  Rows, columns and submatrices            9
                     52:      4.  FOR, WHILE and IF                       10
                     53:      5.  Commands, text, files and macros        12
                     54:      6.  Census example                          13
                     55:      7.  Partial differential equation           19
                     56:      8.  Eigenvalue sensitivity example          23
                     57:      9.  Syntax diagrams                         27
                     58:     10.  The parser-interpreter                  31
                     59:     11.  The numerical algorithms                34
                     60:     12.  FLOP and CHOP                           37
                     61:     13.  Communicating with other programs       41
                     62:     Appendix.  The HELP file                     46
                     63: .in -5
                     64: .ll +5
                     65: .bp 1
                     66: \      
                     67: .sp 7
                     68: .ce 2
                     69: MATLAB Users' Guide
                     70: February, 1982
                     71: .sp 2
                     72: .ce 3
                     73: Cleve Moler
                     74: Department of Computer Science
                     75: University of New Mexico
                     76: .sp 2
                     77: .pp
                     78: MATLAB is an interactive computer program that serves as a
                     79: convenient "laboratory" for computations involving matrices.
                     80: It provides easy access to matrix software developed by the
                     81: LINPACK and EISPACK projects [1-3].  The capabilities range from
                     82: standard tasks such as solving simultaneous linear equations and
                     83: inverting matrices, through symmetric and nonsymmetric eigenvalue
                     84: problems, to fairly sophisticated matrix tools such as the singular
                     85: value decomposition.
                     86: .pp
                     87: It is expected that one of MATLAB's primary uses will be in
                     88: the classroom.  It should be useful in introductory courses in
                     89: applied linear algebra, as well as more advanced courses in numerical
                     90: analysis, matrix theory, statistics and applications of matrices
                     91: to other disciplines.  In nonacademic settings, MATLAB can serve as a
                     92: "desk calculator" for the quick solution of small problems involving
                     93: matrices.
                     94: .pp
                     95: The program is written in Fortran and is designed to be readily
                     96: installed under any operating system which permits interactive
                     97: execution of Fortran programs.  The resources required are fairly
                     98: modest.  There are less than 7000 lines of Fortran source code,
                     99: including the LINPACK and EISPACK subroutines used.  With proper
                    100: use of overlays, it is possible run the system on a minicomputer
                    101: with only 32K bytes of memory.
                    102: .pp
                    103: The size of the matrices that can be handled in MATLAB
                    104: depends upon the amount of storage that is set aside when the
                    105: system is compiled on a particular machine.  We have found that
                    106: an allocation of 5000 words for matrix elements is usually quite
                    107: satisfactory.  This provides room for several 20 by 20 matrices,
                    108: for example.  One implementation on a virtual memory system
                    109: provides 100,000 elements.  Since most of the algorithms used
                    110: access memory in a sequential fashion, the large amount of
                    111: allocated storage causes no difficulties.
                    112: .pp
                    113: In some ways, MATLAB resembles SPEAKEASY [4] and, to a
                    114: lesser extent, APL.  All are interactive terminal languages
                    115: that ordinarily accept single-line commands or statements, process
                    116: them immediately, and print the results.  All have arrays or matrices
                    117: as principal data types.  But for MATLAB, the matrix is the only
                    118: data type (although scalars, vectors and text are special cases),
                    119: the underlying system is portable and requires fewer resources,
                    120: and the supporting subroutines are more powerful and, in some
                    121: cases, have better numerical properties.
                    122: .pp
                    123: Together, LINPACK and EISPACK represent the state of the art
                    124: in software for matrix computation.  EISPACK is a package of over
                    125: 70 Fortran subroutines for various matrix eigenvalue computations
                    126: that are based for the most part on Algol procedures published by
                    127: Wilkinson, Reinsch and their colleagues [5].  LINPACK is a package
                    128: of 40 Fortran subroutines (in each of four data types) for solving
                    129: and analyzing simultaneous linear equations and related matrix
                    130: problems.  Since MATLAB is not primarily concerned with either
                    131: execution time efficiency or storage savings, it ignores most of
                    132: the special matrix properties that LINPACK and EISPACK subroutines
                    133: use to advantage.  Consequently, only 8 subroutines from LINPACK
                    134: and 5 from EISPACK are actually involved.
                    135: .pp
                    136: In more advanced applications, MATLAB can be used in conjunction
                    137: with other programs in several ways.
                    138: It is possible to define new MATLAB functions and add them to the system.
                    139: With most operating systems, it is possible to use the local
                    140: file system to pass matrices between MATLAB and other programs.
                    141: MATLAB command and statement input can be obtained from
                    142: a local file instead of from the terminal.
                    143: The most power and flexibility is obtained by using MATLAB
                    144: as a subroutine which is called by other programs.
                    145: .pp
                    146: This document first gives an overview of MATLAB from the user's
                    147: point of view.  
                    148: Several extended examples involving data fitting, partial differential
                    149: equations, eigenvalue sensitivity and other topics are included.
                    150: A formal definition of the MATLAB language and
                    151: an brief description of the parser and interpreter are given.
                    152: The system was designed and programmed using techniques described
                    153: by Wirth [6], implemented in nonrecursive, portable Fortran.
                    154: There is a brief discussion of some of the matrix algorithms
                    155: and of their numerical properties.
                    156: The final section describes how MATLAB can be used with other programs.
                    157: The appendix includes the HELP documentation available on-line.
                    158: 
                    159: 
                    160: 1.  Elementary operations
                    161: 
                    162: .pp
                    163: MATLAB works with essentially only one kind of object,
                    164: a rectangular matrix with complex elements.  If the imaginary parts
                    165: of the elements are all zero, they are not printed, but they still
                    166: occupy storage.  In some situations, special meaning is attached
                    167: to 1 by 1 matrices, that is scalars, and to 1 by n and m by 1
                    168: matrices, that is row and column vectors.
                    169: .pp
                    170: Matrices can be introduced into MATLAB in four different ways:
                    171:         --  Explicit list of elements,
                    172:         --  Use of FOR and WHILE statements,
                    173:         --  Read from an external file,
                    174:         --  Execute an external Fortran program.
                    175: .pp
                    176: The explicit list is surrounded by angle brackets, '<' and '>',
                    177: and uses the semicolon ';' to indicate the ends of the rows.
                    178: For example, the input line
                    179: 
                    180:    A = <1 2 3; 4 5 6; 7 8 9>
                    181: 
                    182: will result in the output
                    183: 
                    184:    A     =
                    185: 
                    186:        1.    2.   3.
                    187:        4.    5.   6.
                    188:        7.    8.   9.
                    189: 
                    190: The matrix A will be saved for later use.  The individual elements
                    191: are separated by commas or blanks and can be any MATLAB expressions,
                    192: for example
                    193: 
                    194:    x = < -1.3, 4/5, 4*atan(1) >
                    195: 
                    196: results in
                    197: 
                    198:    X     =
                    199: 
                    200:      -1.3000   0.8000   3.1416
                    201: 
                    202: The elementary functions available include sqrt, log, exp, sin, cos,
                    203: atan, abs, round, real, imag, and conjg.
                    204: .pp
                    205: Large matrices can be spread across several input lines, with the 
                    206: carriage returns replacing the semicolons.  The above matrix 
                    207: could also have been produced by
                    208:    
                    209:    A = < 1 2 3
                    210:          4 5 6
                    211:          7 8 9 >
                    212: 
                    213: .pp
                    214: Matrices can be input from the local file system.
                    215: Say a file named 'xyz' contains five lines of text,
                    216: 
                    217: .ne 5
                    218:    A = <
                    219:    1 2 3
                    220:    4 5 6
                    221:    7 8 9
                    222:    >;
                    223: 
                    224: then the MATLAB statement EXEC('xyz') reads the matrix and
                    225: assigns it to A .
                    226: .pp
                    227: The FOR statement allows the generation of matrices whose
                    228: elements are given by simple formulas.  Our example matrix  A
                    229: could also have been produced by
                    230: 
                    231:    for i = 1:3, for j = 1:3, a(i,j) = 3*(i-1)+j;
                    232: 
                    233: The semicolon at the end of the line suppresses the printing,
                    234: which in this case would have been nine versions of A with changing
                    235: elements.
                    236: .pp
                    237: Several statements may be given on a line, separated
                    238: by semicolons or commas.
                    239: .pp
                    240: Two consecutive periods anywhere on a line indicate
                    241: continuation.  The periods and any following characters are deleted,
                    242: then another line is input and concatenated onto the previous line.
                    243: .pp
                    244: Two consecutive slashes anywhere on a line cause the remainder
                    245: of the line to be ignored.  This is useful for inserting comments.
                    246: .pp
                    247: Names of variables are formed by a letter, followed by any
                    248: number of letters and digits, but only the first 4 characters
                    249: are remembered.
                    250: .pp
                    251: The special character prime (') is used to denote the transpose
                    252: of a matrix, so
                    253: 
                    254:    x = x'
                    255: 
                    256: changes the row vector above into the column vector
                    257: 
                    258:    X     =
                    259: 
                    260:      -1.3000
                    261:       0.8000
                    262:       3.1416
                    263: 
                    264: .pp
                    265: Individual matrix elements may be referenced by enclosing their 
                    266: subscripts in parentheses.  When any element is changed, the entire
                    267: matrix is reprinted.  For example, using the above matrix,
                    268:    
                    269:    a(3,3) = a(1,3) + a(3,1)
                    270:   
                    271: results in
                    272:   
                    273:    A     =
                    274:   
                    275:        1.    2.    3.
                    276:        4.    5.    6.
                    277:        7.    8.   10.
                    278:   
                    279: .pp
                    280: Addition, subtraction and multiplication of matrices are
                    281: denoted by +, -, and * .  The operations are performed
                    282: whenever the matrices have the proper dimensions.  For example,
                    283: with the above A and x, the expressions A + x and x*A are incorrect
                    284: because A is 3 by 3 and x is now 3 by 1.  However,
                    285: 
                    286:    b = A*x
                    287: 
                    288: is correct and results in the output
                    289: 
                    290:    B     =
                    291: 
                    292:       9.7248
                    293:      17.6496
                    294:      28.7159
                    295: 
                    296: Note that both upper and lower case letters are allowed for input
                    297: (on those systems which have both), but that lower case is converted
                    298: to upper case.
                    299: .pp
                    300: There are two "matrix division" symbols in MATLAB, \\ and / .
                    301: (If your terminal does not have a backslash, use $ instead, or see CHAR.)
                    302: If A and B are matrices, then A\\B and B/A correspond formally
                    303: to left and right multiplication of B by the inverse of A , that is
                    304: inv(A)*B and B*inv(A), but the result is obtained directly
                    305: without the computation of the inverse.  In the scalar case,
                    306: 3\\1 and 1/3 have the same value, namely one-third.  In general,
                    307: A\\B denotes the solution X to the equation A*X = B and B/A denotes
                    308: the solution to X*A = B.
                    309: .pp
                    310: Left division, A\\B, is defined whenever B has as many rows as A .
                    311: If A is square, it is factored using Gaussian elimination.  The
                    312: factors are used to solve the equations  A*X(:,j) = B(:,j)
                    313: where B(:,j) denotes the j-th column of B.  The result is a
                    314: matrix X with the same dimensions as B.  If A is nearly singular
                    315: (according to the LINPACK condition estimator, RCOND), a
                    316: warning message is printed.  If A is not square, it is factored
                    317: using Householder orthogonalization with column pivoting.  The factors
                    318: are used to solve the under- or overdetermined equations in a least squares
                    319: sense.  The result is an m by n matrix X where m is the
                    320: number of columns of A and n is the number of columns of B .
                    321: Each column of X has at most k nonzero components, where k is the
                    322: effective rank of A .
                    323: .pp
                    324: Right division, B/A, can be defined in terms of left division
                    325: by  B/A = (A'\\B')'.
                    326: .pp
                    327: For example, since our vector  b   was computed as  A*x,
                    328: the statement
                    329:   
                    330:    y = A\\b
                    331:    
                    332: results in
                    333:    
                    334:    Y     =
                    335: 
                    336:      -1.3000
                    337:       0.8000
                    338:       3.1416
                    339: 
                    340: Of course,  y  is not exactly equal to  x  because of the 
                    341: roundoff errors involved in both  A*x  and  A\\b , but we are
                    342: not printing enough digits to see the difference.
                    343: The result of the statement
                    344:    
                    345:    e = x - y
                    346:    
                    347: depends upon the particular computer being used.  In one case
                    348: it produces
                    349:    
                    350:    E     =
                    351:    
                    352:       1.0e-15 *
                    353:    
                    354:         .3053
                    355:        -.2498
                    356:         .0000
                    357:    
                    358: The quantity 1.0e-15 is a scale factor which multiplies all the
                    359: components which follow.  Thus our vectors  x  and  y  actually agree to 
                    360: about 15 decimal places on this computer.  
                    361: .pp
                    362: It is also possible to obtain element-by-element multiplicative
                    363: operations.  If A and B have the same dimensions, then
                    364: A .* B denotes the matrix whose elements are simply the products
                    365: of the individual elements of A and B .  
                    366: The expressions  A ./ B and A .\\ B give the quotients of the 
                    367: individual elements.
                    368: .pp
                    369: There are several possible output formats.  The statement
                    370:    
                    371:    long, x
                    372:    
                    373: results in
                    374:    
                    375:    X     = 
                    376:    
                    377:       -1.300000000000000
                    378:         .800000000000000
                    379:        3.141592653589793
                    380:    
                    381: The statement
                    382:    
                    383:    short
                    384:    
                    385: restores the original format.
                    386: .pp
                    387: The expression A**p means A to the p-th power.  It is defined
                    388: if A is a square matrix and p is a scalar.  If p is an integer
                    389: greater than one, the power is computed by repeated multiplication.
                    390: For other values of p the calculation involves the eigenvalues
                    391: and eigenvectors of A.
                    392: .pp
                    393: Previously defined matrices and matrix expressions can be used
                    394: inside brackets to generate larger matrices, for example
                    395: 
                    396:    C = <A, b; <4 2 0>*x, x'>
                    397: 
                    398: results in
                    399: 
                    400: 
                    401: .ne 6
                    402:    C     =
                    403: 
                    404:       1.0000   2.0000   3.0000   9.7248
                    405:       4.0000   5.0000   6.0000  17.6496
                    406:       7.0000   8.0000  10.0000  28.7159
                    407:      -3.6000  -1.3000   0.8000   3.1416
                    408: 
                    409: .pp
                    410: There are four predefined variables, EPS, FLOP, RAND and EYE.
                    411: The variable EPS is used as a tolerance is determining such things
                    412: as near singularity and rank.  Its initial value is the distance
                    413: from 1.0 to the next largest floating point number on the 
                    414: particular computer being used.  The user may reset this to
                    415: any other value, including zero.  
                    416: EPS is changed by CHOP, which is described in section 12.
                    417: .pp
                    418: The value of RAND is a random variable, with a choice of a uniform or a
                    419: normal distribution.  
                    420: .pp
                    421: The name EYE is used in place of I to denote
                    422: identity matrices because I is often used as a subscript or
                    423: as sqrt(-1).  The dimensions of EYE are determined by context.
                    424: For example,
                    425: 
                    426:    B = A + 3*EYE
                    427: 
                    428: adds 3 to the diagonal elements of A and
                    429: 
                    430:    X = EYE/A
                    431: 
                    432: is one of several ways in MATLAB to invert a matrix.
                    433: .pp
                    434: FLOP provides a count of the number of floating point
                    435: operations, or "flops", required for each calculation.
                    436: .pp
                    437: A statement may consist of an expression alone, in which case
                    438: a variable named ANS is created and the result stored in ANS for
                    439: possible future use.  Thus
                    440: 
                    441:    A\\A - EYE
                    442: 
                    443: is the same as
                    444: 
                    445:    ANS = A\\A - EYE
                    446: 
                    447: (Roundoff error usually causes this result to be a matrix of
                    448: "small" numbers, rather than all zeros.)
                    449: .pp
                    450: All computations are done using either single or double
                    451: precision real arithmetic, whichever is appropriate for the
                    452: particular computer.  There is no mixed-precision arithmetic.
                    453: The Fortran COMPLEX data type is not used because many systems
                    454: create unnecessary underflows and overflows with complex operations
                    455: and because some systems do not allow double precision complex
                    456: arithmetic.
                    457: 
                    458: 
                    459: 2.  MATLAB functions
                    460: .pp
                    461: Much of MATLAB's computational power comes from the various
                    462: matrix functions available.  The current list includes:
                    463: 
                    464:    INV(A)          - Inverse.
                    465:    DET(A)          - Determinant.
                    466:    COND(A)         - Condition number.
                    467:    RCOND(A)        - A measure of nearness to singularity.
                    468:    EIG(A)          - Eigenvalues and eigenvectors.
                    469:    SCHUR(A)        - Schur triangular form.
                    470:    HESS(A)         - Hessenberg or tridiagonal form.
                    471:    POLY(A)         - Characteristic polynomial.
                    472:    SVD(A)          - Singular value decomposition.
                    473:    PINV(A,eps)     - Pseudoinverse with optional tolerance.
                    474:    RANK(A,eps)     - Matrix rank with optional tolerance.
                    475:    LU(A)           - Factors from Gaussian elimination.
                    476:    CHOL(A)         - Factor from Cholesky factorization.
                    477:    QR(A)           - Factors from Householder orthogonalization.
                    478:    RREF(A)         - Reduced row echelon form.
                    479:    ORTH(A)         - Orthogonal vectors spanning range of A.
                    480:    EXP(A)          - e to the A.
                    481:    LOG(A)          - Natural logarithm.
                    482:    SQRT(A)         - Square root.
                    483:    SIN(A)          - Trigonometric sine.
                    484:    COS(A)          - Cosine.
                    485:    ATAN(A)         - Arctangent.
                    486:    ROUND(A)        - Round the elements to nearest integers.
                    487:    ABS(A)          - Absolute value of the elements.
                    488:    REAL(A)         - Real parts of the elements.
                    489:    IMAG(A)         - Imaginary parts of the elements.
                    490:    CONJG(A)        - Complex conjugate.
                    491:    SUM(A)          - Sum of the elements.
                    492:    PROD(A)         - Product of the elements.
                    493:    DIAG(A)         - Extract or create diagonal matrices.
                    494:    TRIL(A)         - Lower triangular part of A.
                    495:    TRIU(A)         - Upper triangular part of A.
                    496:    NORM(A,p)       - Norm with p = 1, 2 or 'Infinity'.
                    497:    EYE(m,n)        - Portion of identity matrix.
                    498:    RAND(m,n)       - Matrix with random elements.
                    499:    ONES(m,n)       - Matrix of all ones.
                    500:    MAGIC(n)        - Interesting test matrices.
                    501:    HILBERT(n)      - Inverse Hilbert matrices.
                    502:    ROOTS(C)        - Roots of polynomial with coefficients C.
                    503:    DISPLAY(A,p)    - Print base p representation of A.
                    504:    KRON(A,B)       - Kronecker tensor product of A and B.
                    505:    PLOT(X,Y)       - Plot Y as a function of X .
                    506:    RAT(A)          - Find "simple" rational approximation to A.
                    507:    USER(A)         - Function defined by external program.
                    508: .pp
                    509: Some of these functions have different interpretations when
                    510: the argument is a matrix or a vector and some of them have additional
                    511: optional arguments.  Details are given in the HELP document in the
                    512: appendix.
                    513: .pp
                    514: Several of these functions can be used in a generalized
                    515: assignment statement with two or three variables on the left hand
                    516: side.  For example
                    517: 
                    518:    <X,D> = EIG(A)
                    519: 
                    520: stores the eigenvectors of A in the matrix X and a diagonal matrix
                    521: containing the eigenvalues in the matrix D.  The statement
                    522: 
                    523:    EIG(A)
                    524: 
                    525: simply computes the eigenvalues and stores them in ANS.
                    526: .pp
                    527: Future versions of MATLAB will probably include additional
                    528: functions, since they can easily be added to the system.
                    529: 
                    530: 
                    531: 
                    532: 3.  Rows, columns and submatrices
                    533: 
                    534: .pp
                    535: Individual elements of a matrix can be accessed by giving
                    536: their subscripts in parentheses, eg. A(1,2), x(i), TAB(ind(k)+1).
                    537: An expression used as a subscript is rounded to the nearest
                    538: integer.
                    539: .pp
                    540: Individual rows and columns can be accessed using a colon ':'
                    541: (or a '|') for the free subscript.  
                    542: For example, A(1,:) is the first row of A and A(:,j) is the j-th column.
                    543: Thus
                    544: 
                    545:    A(i,:) = A(i,:) + c*A(k,:)
                    546: 
                    547: adds c times the k-th row of A to the i-th row.
                    548: .pp
                    549: The colon is used in several other ways in MATLAB, but
                    550: all of the uses are based on the following definition.
                    551: 
                    552:    j:k    is the same as  <j, j+1, ..., k>
                    553:    j:k    is empty if  j > k .
                    554:    j:i:k  is the same as  <j, j+i, j+2i, ..., k>
                    555:    j:i:k  is empty if  i > 0 and j > k or if i < 0 and j < k .
                    556: 
                    557: The colon is usually used with integers, but it is possible to
                    558: use arbitrary real scalars as well.  Thus
                    559: 
                    560:    1:4  is the same as  <1, 2, 3, 4>
                    561:    0: 0.1: 0.5 is the same as <0.0, 0.1, 0.2, 0.3, 0.4, 0.5>
                    562: 
                    563: .pp
                    564: In general, a subscript can be a vector.  If X and V are
                    565: vectors, then X(V) is <X(V(1)), X(V(2)), ..., X(V(n))> . This
                    566: can also be used with matrices.  If V has m components and
                    567: W has n components, then A(V,W) is the m by n matrix formed from
                    568: the elements of A whose subscripts are the elements of V and W.
                    569: Combinations of the colon notation and the indirect subscripting
                    570: allow manipulation of various submatrices. For example,
                    571: 
                    572:    A(<1,5>,:) = A(<5,1>,:)  interchanges rows 1 and 5 of A.
                    573:    A(2:k,1:n)  is the submatrix formed from rows 2 through k
                    574:       and columns 1 through n of A .
                    575:    A(:,<3 1 2>)  is a permutation of the first three columns.
                    576: 
                    577: .pp
                    578: The notation A(:) has a special meaning.  On the right hand side
                    579: of an assignment statement, it denotes all the elements of A,
                    580: regarded as a single column.
                    581: When an expression is assigned to A(:), the current dimensions of
                    582: A, rather than of the expression, are used.
                    583: 
                    584:    
                    585: 4.  FOR, WHILE and IF
                    586: 
                    587: .pp
                    588: The FOR clause allows statements to be repeated a specific
                    589: number of times.  The general form is
                    590: 
                    591:    FOR variable = expr,  statement, ..., statement, END
                    592: 
                    593: The END and the comma before it may be omitted.  In general,
                    594: the expression may be a matrix, in which case the columns are
                    595: stored one at a time in the variable and the following statements,
                    596: up to the END or the end of the line, are executed.  The
                    597: expression is often of the form j:k, and its "columns" are
                    598: simply the scalars from j to k.  Some examples (assume n has
                    599: already been assigned a value):
                    600: 
                    601:    for i = 1:n, for j = 1:n, A(i,j) = 1/(i+j-1);
                    602: 
                    603: generates the Hilbert matrix.
                    604: 
                    605:    for j = 2:n-1, for i = j:n-1, ...
                    606:       A(i,j) = 0; end; A(j,j) = j; end; A
                    607: 
                    608: changes all but the "outer edge" of the lower triangle and
                    609: then prints the final matrix.
                    610: 
                    611:    for h = 1.0: -0.1: -1.0, (<h, cos(pi*h)>)
                    612: 
                    613: prints a table of cosines.
                    614: 
                    615:    <X,D> = EIG(A); for v = X, v, A*v
                    616: 
                    617: displays eigenvectors, one at a time.
                    618: .pp
                    619: The WHILE clause allows statements to be repeated an
                    620: indefinite number of times.  The general form is
                    621: 
                    622:    WHILE expr relop expr,   statement,..., statement, END
                    623: 
                    624: where relop is =, <, >, <=, >=, or <> (not equal) .  The statements
                    625: are repeatedly executed as long as the indicated comparison
                    626: between the real parts of the first components of the two
                    627: expressions is true.  Here are two examples.  (Exercise for
                    628: the reader: What do these segments do?)
                    629: 
                    630:    eps = 1;
                    631:    while 1 + eps > 1, eps = eps/2;
                    632:    eps = 2*eps
                    633: 
                    634:    E = 0*A;  F = E + EYE; n = 1;
                    635:    while NORM(E+F-E,1) > 0, E = E + F; F = A*F/n; n = n + 1;
                    636:    E
                    637: 
                    638: .pp
                    639: The IF clause allows conditional execution of statements.
                    640: The general form is
                    641: 
                    642:    IF expr relop expr,   statement, ..., statement,
                    643:       ELSE statement, ..., statement
                    644: 
                    645: The first group of statements are executed if the relation is
                    646: true and the second group are executed if the relation is false.
                    647: The ELSE and the statements following it may be omitted.
                    648: For example,
                    649: 
                    650:    if abs(i-j) = 2, A(i,j) = 0;
                    651: 
                    652: 
                    653: 5.  Commands, text, files and macros.
                    654: 
                    655: .pp
                    656: MATLAB has several commands which control the output format
                    657: and the overall execution of the system.
                    658: .pp
                    659: The HELP command allows on-line access to short portions
                    660: of text describing various operations, functions and special
                    661: characters.  The entire HELP document is reproduced in an
                    662: appendix.
                    663: .pp
                    664: Results are usually printed in a scaled fixed point format
                    665: that shows 4 or 5 significant figures.  The commands SHORT, LONG,
                    666: SHORT E, LONG E and LONG Z alter the output format, but do not alter
                    667: the precision of the computations or the internal storage.
                    668: .pp
                    669: The WHO, WHAT and WHY commands provide information about
                    670: the functions and variables that are currently defined.
                    671: .pp
                    672: The CLEAR command erases all variables, except EPS, FLOP, RAND and EYE.  
                    673: The statement A = <> indicates that a "0 by 0"
                    674: matrix is to be stored in A.  This causes A to be erased so
                    675: that its storage can be used for other variables.
                    676: .pp
                    677: The RETURN and EXIT commands cause return to the underlying
                    678: operating system through the Fortran RETURN statement.
                    679: .pp
                    680: MATLAB has a limited facility for handling text.  Any string
                    681: of characters delineated by quotes (with two quotes used to
                    682: allow one quote within the string) is saved as a vector of
                    683: integer values with '1' = 1, 'A' = 10, ' ' = 36, etc.  
                    684: (The complete list is in the appendix under CHAR.)            
                    685: For example
                    686: 
                    687:    '2*A + 3'  is the same as  <2 43 10 36 41 36 3>
                    688: 
                    689: It is possible, though seldom very meaningful, to use such strings
                    690: in matrix operations.  More frequently, the text is used as
                    691: a special argument to various functions.
                    692: 
                    693:    NORM(A,'inf')    computes the infinity norm of A .
                    694:    DISPLAY(T)       prints the text stored in T .
                    695:    EXEC('file')     obtains MATLAB input from an external file.
                    696:    SAVE('file')     stores all the current variables in a file.
                    697:    LOAD('file')     retrieves all the variables from a file.
                    698:    PRINT('file',X)  prints X on a file.
                    699:    DIARY('file')    makes a copy of the complete MATLAB session.
                    700: 
                    701: .pp
                    702: The text can also be used in a limited string substitution macro facility.
                    703: If a variable, say T, contains the source text for a MATLAB
                    704: statement or expression, then the construction
                    705:    
                    706:    > T <
                    707:    
                    708: causes T to be executed or evaluated.  For example
                    709:    
                    710:    T = '2*A + 3';
                    711:    S = 'B = >T< + 5'
                    712:    A = 4;
                    713:    > S <
                    714:    
                    715: produces
                    716: 
                    717:    B     =
                    718: 
                    719:       16.
                    720:   
                    721: Some other examples are given under MACRO in the appendix.
                    722: This facility is useful for fairly short statements and expressions.
                    723: More complicated MATLAB "programs" should use the EXEC facility.
                    724: .pp
                    725: The operations which access external files cannot be handled
                    726: in a completely machine-independent manner by portable Fortran
                    727: code.  It is necessary for each particular installation to
                    728: provide a subroutine which associates external text files with
                    729: Fortran logical unit numbers.
                    730: 
                    731:   
                    732: 6.  Census example
                    733: 
                    734: .pp
                    735: Our first extended example involves predicting the population of the
                    736: United States in 1980 using extrapolation of
                    737: various fits to the census data from 1900 through 1970.
                    738: There are eight observations, so we begin with the MATLAB statement
                    739: .sp
                    740:    n = 8
                    741: .sp
                    742: The values of the dependent variable, the population in millions,
                    743: can be entered with
                    744: .sp
                    745: .ne 2
                    746:    y = < 75.995   91.972  105.711  123.203   ...
                    747:         131.669  150.697  179.323  203.212>'
                    748: .sp
                    749: In order to produce a reasonably scaled matrix, the independent variable,
                    750: time, is transformed from the interval [1900,1970] to [-1.00,0.75].
                    751: This can be accomplished directly with
                    752: .sp
                    753:    t = -1.0:0.25:0.75
                    754: .sp
                    755: or in a fancier, but perhaps clearer, way with
                    756: .sp
                    757:    t = 1900:10:1970;   t = (t - 1940*ones(t))/40
                    758: .sp
                    759: Either of these is equivalent to
                    760: .sp
                    761:    t = <-1 -.75 -.50 -.25 0 .25 .50 .75>
                    762: .pp
                    763: The interpolating polynomial of degree  n-1  involves an Vandermonde
                    764: matrix of order  n  with elements that might be generated by
                    765: .sp
                    766: .ne 2
                    767:    for i = 1:n, for j = 1:n, a(i,j) = t(i)**(j-1);
                    768: .sp
                    769: However, this results in an error caused by 0**0  when  i = 5 and j = 1 .
                    770: The preferable approach is
                    771: .sp
                    772: .ne 2
                    773:    A = ones(n,n);
                    774:    for i = 1:n, for j = 2:n, a(i,j) = t(i)*a(i,j-1);
                    775: .sp
                    776: Now the statement
                    777: .sp
                    778:    cond(A)
                    779: .sp
                    780: produces the output
                    781: .sp
                    782: .ne 3
                    783:    ANS   =
                    784: .sp
                    785:       1.1819E+03
                    786: .sp
                    787: which indicates that transformation of the time variable has resulted
                    788: in a reasonably well conditioned matrix.
                    789: .pp
                    790: The statement
                    791: .sp
                    792:    c = A\\y
                    793: .sp
                    794: results in
                    795: .sp
                    796: .ne 10
                    797:    C     =
                    798: .sp
                    799:      131.6690
                    800:       41.0406
                    801:      103.5396
                    802:      262.4535
                    803:     -326.0658
                    804:     -662.0814
                    805:      341.9022
                    806:      533.6373
                    807: .sp
                    808: These are the coefficients in the interpolating polynomial
                    809: .sp
                    810:                           n-1
                    811:       c  + c t + ... + c t
                    812:        1    2           n
                    813: .sp
                    814: Our transformation of the time variable has resulted in  t = 1
                    815: corresponding to the year 1980.  Consequently, the extrapolated
                    816: population is simply the sum of the coefficients.
                    817: This can be computed by
                    818: .sp
                    819:    p = sum(c)
                    820: .sp
                    821: The result is
                    822: .sp
                    823: .ne 3
                    824:    P     =
                    825: .sp
                    826:      426.0950
                    827: .sp
                    828: which indicates a 1980 population of over 426 million.
                    829: Clearly, using the seventh degree interpolating polynomial to
                    830: extrapolate even a fairly short distance beyond the end of the
                    831: data interval is not a good idea.
                    832: .pp
                    833: The coefficients in least squares fits by polynomials of lower degree
                    834: can be computed using fewer than  n  columns of the matrix.
                    835: .sp
                    836:    for k = 1:n, c = A(:,1:k)\\y,  p = sum(c)
                    837: .sp
                    838: would produce the coefficients of these fits, as well as the resulting
                    839: extrapolated population.
                    840: If we do not want to print all the coefficients, we can simply
                    841: generate a small table of populations predicted by polynomials
                    842: of degrees zero through seven.
                    843: We also compute the maximum deviation
                    844: between the fitted and observed values.
                    845: .sp
                    846:    for k = 1:n, X = A(:,1:k);  c = X\\y;  ...
                    847:       d(k) = k-1;  p(k) = sum(c);  e(k) = norm(X*c-y,'inf');
                    848:    <d, p, e>
                    849: .sp
                    850: The resulting output is
                    851: .sp
                    852: .ne 8
                    853:       0   132.7227  70.4892
                    854:       1   211.5101   9.8079
                    855:       2   227.7744   5.0354
                    856:       3   241.9574   3.8941
                    857:       4   234.2814   4.0643
                    858:       5   189.7310   2.5066
                    859:       6   118.3025   1.6741
                    860:       7   426.0950   0.0000
                    861: .sp
                    862: The zeroth degree fit, 132.7 million, is the result of fitting a constant
                    863: to the data and is simply the average.
                    864: The results obtained with polynomials of degree one through four
                    865: all appear reasonable.
                    866: The maximum deviation of the degree four fit is slightly greater than the degree
                    867: three, even though the sum of the squares of the deviations is less.
                    868: The coefficients of the highest powers in the fits of degree
                    869: five and six turn out to be negative and the predicted populations
                    870: of less than 200 million are probably unrealistic.
                    871: The hopefully absurd prediction of the interpolating polynomial
                    872: concludes the table.
                    873: .pp
                    874: We wish to emphasize that
                    875: roundoff errors are not significant here.  Nearly identical
                    876: results would be obtained on other computers, or with other algorithms.
                    877: The results simply indicate the difficulties associated with
                    878: extrapolation of polynomial fits of even modest degree.
                    879: .pp
                    880: A stabilized fit by a seventh degree polynomial can be obtained
                    881: using the pseudoinverse, but it requires a fairly delicate choice
                    882: of a tolerance. The statement
                    883: .sp
                    884:    s = svd(A)
                    885: .sp
                    886: produces the singular values
                    887: .sp
                    888: .ne 10
                    889:    S     =
                    890: .sp
                    891:       3.4594
                    892:       2.2121
                    893:       1.0915
                    894:       0.4879
                    895:       0.1759
                    896:       0.0617
                    897:       0.0134
                    898:       0.0029
                    899: .sp
                    900: We see that the last three singular values are less than 0.1 ,
                    901: consequently,  A  can be approximately by a matrix of rank five
                    902: with an error less than 0.1 .
                    903: The Moore-Penrose pseudoinverse of this rank five matrix is
                    904: obtained from the singular value decomposition with the following
                    905: statements
                    906: .sp
                    907:    c = pinv(A,0.1)*y, p = sum(c), e = norm(a*c-y,'inf')
                    908: .sp
                    909: The output is
                    910: .sp
                    911: .ne 18
                    912:    C     =
                    913: .sp
                    914:     134.7972
                    915:      67.5055
                    916:      23.5523
                    917:       9.2834
                    918:       3.0174
                    919:       2.6503
                    920:      -2.8808
                    921:       3.2467
                    922: .sp
                    923:    P     =
                    924: .sp
                    925:     241.1720
                    926: .sp
                    927:    E     =
                    928: .sp
                    929:       3.9469
                    930: .sp
                    931: The resulting seventh degree polynomial has coefficients which are much
                    932: smaller than those of the interpolating polynomial given earlier.
                    933: The predicted population and the maximum deviation are reasonable.
                    934: Any choice of the tolerance between the fifth and sixth singular
                    935: values would produce the same results, but choices outside this
                    936: range result in pseudoinverses of different rank and do not work
                    937: as well.
                    938: .pp
                    939: The one term exponential approximation
                    940: .sp
                    941:      y(t) = k exp(pt)
                    942: .sp
                    943: can be transformed into a linear approximation by taking logarithms.
                    944: .sp
                    945: .ne 3
                    946:      log(y(t)) = log k + pt
                    947: .sp
                    948:                = c  + c t
                    949:                   1    2
                    950: .sp
                    951: The following segment makes use of the fact that a function of a vector is
                    952: the function applied to the individual components.
                    953: .sp
                    954: .ne 4
                    955:    X = A(:,1:2);
                    956:    c = X\\log(y)
                    957:    p = exp(sum(c))
                    958:    e = norm(exp(X*c)-y,'inf')
                    959: .sp
                    960: The resulting output is
                    961: .sp
                    962: .ne 12
                    963:    C     =
                    964: .sp
                    965:       4.9083
                    966:       0.5407
                    967: .sp
                    968:    P     =
                    969: .sp
                    970:     232.5134
                    971: .sp
                    972:    E     =
                    973: .sp
                    974:       4.9141
                    975: .sp
                    976: The predicted population and maximum deviation appear satisfactory
                    977: and indicate that the exponential model is a reasonable one to consider.
                    978: .pp
                    979: As a curiousity, we return to the degree six polynomial.
                    980: Since the coefficient of the high order term is negative
                    981: and the value of the polynomial at t = 1 is positive, it must have
                    982: a root at some value of  t  greater than one.
                    983: The statements
                    984: .sp
                    985:    X = A(:,1:7);
                    986:    c = X\\y;
                    987:    c = c(7:-1:1);  //reverse the order of the coefficients
                    988:    z = roots(c)
                    989: .sp
                    990: produce
                    991: .sp
                    992:    Z     =
                    993: .sp
                    994:       1.1023-  0.0000*i
                    995:       0.3021+  0.7293*i
                    996:      -0.8790+  0.6536*i
                    997:      -1.2939-  0.0000*i
                    998:      -0.8790-  0.6536*i
                    999:       0.3021-  0.7293*i
                   1000: .sp
                   1001: There is only one real, positive root.
                   1002: The corresponding time on the original scale is
                   1003: .sp
                   1004:    1940 + 40*real(z(1))
                   1005: .sp
                   1006:      =  1984.091
                   1007: .sp
                   1008: We conclude that
                   1009: the United States population should become zero early in
                   1010: February of 1984.
                   1011: .bp
                   1012: 7.  Partial differential equation example
                   1013: 
                   1014: .pp
                   1015: Our second extended example is a boundary value problem
                   1016: for Laplace's equation.
                   1017: The underlying physical problem involves the conductivity of a
                   1018: medium with cylindrical inclusions and is considered by
                   1019: Keller and Sachs [7].
                   1020: .pp
                   1021: Find a function  u(x,y)  satisfying Laplace's equation
                   1022: .sp
                   1023:                u   + u   = 0
                   1024:                 xx    yy
                   1025: .sp
                   1026: The domain is a unit square with a quarter circle of radius rho removed
                   1027: from one corner.
                   1028: There are Neumann conditions on the top and bottom edges
                   1029: and Dirichlet conditions on the remainder of the boundary.
                   1030: .sp 2
                   1031: .ne 22
                   1032:                          u  = 0
                   1033:                           n
                   1034: 
                   1035:                      -------------
                   1036:                     |             .
                   1037:                     |             .
                   1038:                     |              .
                   1039:                     |               .  u = 1
                   1040:                     |                 .
                   1041:                     |                    .
                   1042:                     |                       .
                   1043:              u = 0  |                        |
                   1044:                     |                        |
                   1045:                     |                        |
                   1046:                     |                        |  u = 1
                   1047:                     |                        |
                   1048:                     |                        |
                   1049:                     |                        |
                   1050:                      ------------------------
                   1051: 
                   1052:                               u  = 0
                   1053:                                n
                   1054: .sp 2
                   1055: The effective conductivity of an medium is then given by the integral
                   1056: along the left edge,
                   1057: .sp
                   1058: .ne 3
                   1059:                             1
                   1060:                  sigma = integral  u (0,y) dy
                   1061:                            0        n
                   1062: .sp
                   1063: It is of interest to study the relation between the radius rho and
                   1064: the conductivity sigma.
                   1065: In particular, as rho approaches one, sigma becomes infinite.
                   1066: .pp
                   1067: Keller and Sachs use a finite difference approximation.
                   1068: The following technique makes use of the fact that the equation is
                   1069: actually Laplace's equation and leads to a much smaller matrix
                   1070: problem to solve.
                   1071: .pp
                   1072: Consider an approximate solution of the form
                   1073: .sp
                   1074: .ne 3
                   1075:                  n      2j-1
                   1076:            u =  sum  c r    cos(2j-1)t
                   1077:                 j=1   j
                   1078: .sp
                   1079: where  r,t  are polar coordinates (t is theta).  The coefficients
                   1080: are to be determined.
                   1081: For any set of coefficients, this function already satisfies the
                   1082: differential equation because the basis functions are harmonic;
                   1083: it satisfies the normal derivative boundary condition on the bottom
                   1084: edge of the domain because we used  cos t  in preference to  sin t ;
                   1085: and it satisfies the boundary condition on the left edge of the domain
                   1086: because we use only odd multiples of  t .
                   1087: .pp
                   1088: The computational task is to find coefficients  so that the
                   1089: boundary conditions on the remaining edges are satisfied as well as
                   1090: possible.
                   1091: To accomplish this, pick  m  points  (r,t)  on the remaining edges.
                   1092: It is desirable to have  m > n  and in practice we usually choose
                   1093: m  to be two or three times as large as  n .
                   1094: Typical values of  n  are 10 or 20 and of  m  are 20 to 60.
                   1095: An  m  by  n  matrix  A  is generated.  The  i,j  element is the j-th
                   1096: basis function, or its normal derivative, evaluated at the i-th boundary
                   1097: point.
                   1098: A right hand side with  m  components is also generated.  In this example,
                   1099: the elements of the right hand side are either zero or one.
                   1100: The coefficients are then found by solving the overdetermined set of
                   1101: equations
                   1102: .sp
                   1103:             Ac = b
                   1104: .sp
                   1105: in a least squares sense.
                   1106: .pp
                   1107: Once the coefficients have been determined, the approximate solution
                   1108: is defined everywhere on the domain.  It is then possible to
                   1109: compute the effective conductivity sigma .  In fact, a very simple
                   1110: formula results,
                   1111: .sp
                   1112: .ne 3
                   1113:                      n       j-1
                   1114:            sigma =  sum  (-1)   c
                   1115:                     j=1          j
                   1116: .pp
                   1117: To use MATLAB for this problem, the following "program" is first stored in
                   1118: the local computer file system, say under the name "PDE".
                   1119: .bp
                   1120: .nf
                   1121: //Conductivity example.
                   1122: //Parameters ---
                   1123:    rho       //radius of cylindrical inclusion
                   1124:    n         //number of terms in solution
                   1125:    m         //number of boundary points
                   1126: //initialize operation counter
                   1127:    flop = <0 0>;
                   1128: //initialize variables
                   1129:    m1 = round(m/3);   //number of points on each straight edge
                   1130:    m2 = m - m1;       //number of points with Dirichlet conditions
                   1131:    pi = 4*atan(1);
                   1132: //generate points in Cartesian coordinates
                   1133:    //right hand edge
                   1134:    for i = 1:m1, x(i) = 1; y(i) = (1-rho)*(i-1)/(m1-1);
                   1135:    //top edge
                   1136:    for i = m2+1:m, x(i) = (1-rho)*(m-i)/(m-m2-1); y(i) = 1;
                   1137:    //circular edge
                   1138:    for i = m1+1:m2, t = pi/2*(i-m1)/(m2-m1+1); ...
                   1139:       x(i) = 1-rho*sin(t);  y(i) = 1-rho*cos(t);
                   1140: //convert to polar coordinates
                   1141:    for i = 1:m-1, th(i) = atan(y(i)/x(i));  ...
                   1142:       r(i) = sqrt(x(i)**2+y(i)**2);
                   1143:    th(m) = pi/2;  r(m) = 1;
                   1144: //generate matrix
                   1145:    //Dirichlet conditions
                   1146:    for i = 1:m2, for j = 1:n, k = 2*j-1; ...
                   1147:       a(i,j) = r(i)**k*cos(k*th(i));
                   1148:    //Neumann conditions
                   1149:    for i = m2+1:m, for j = 1:n, k = 2*j-1; ...
                   1150:       a(i,j) = k*r(i)**(k-1)*sin((k-1)*th(i));
                   1151: //generate right hand side
                   1152:    for i = 1:m2, b(i) = 1;
                   1153:    for i = m2+1:m, b(i) = 0;
                   1154: //solve for coefficients
                   1155:    c = A\\b
                   1156: //compute effective conductivity
                   1157:    c(2:2:n) = -c(2:2:n);
                   1158:    sigma = sum(c)
                   1159: //output total operation count
                   1160:    ops = flop(2)
                   1161: .fi
                   1162: .sp 3
                   1163: .pp
                   1164: The program can be used within MATLAB by setting the three
                   1165: parameters and then accessing the file.
                   1166: For example,
                   1167: .sp
                   1168: .ne 4
                   1169:    rho = .9;
                   1170:    n = 15;
                   1171:    m = 30;
                   1172:    exec('PDE')
                   1173: .sp
                   1174: The resulting output is
                   1175: .sp
                   1176:    RHO   =
                   1177: .sp
                   1178:       .9000
                   1179: .sp
                   1180:    N     =
                   1181: .sp
                   1182:     15.
                   1183: .sp
                   1184:    M     =
                   1185: .sp
                   1186:     30.
                   1187: .sp
                   1188: .ne 17
                   1189:    C     =
                   1190: .sp
                   1191:       2.2275
                   1192:      -2.2724
                   1193:       1.1448
                   1194:       0.1455
                   1195:      -0.1678
                   1196:      -0.0005
                   1197:      -0.3785
                   1198:       0.2299
                   1199:       0.3228
                   1200:      -0.2242
                   1201:      -0.1311
                   1202:       0.0924
                   1203:       0.0310
                   1204:      -0.0154
                   1205:      -0.0038
                   1206: .sp
                   1207:    SIGM  =
                   1208: .sp
                   1209:       5.0895
                   1210: .sp
                   1211:    OPS   =
                   1212: .sp
                   1213:       16204.
                   1214: .sp
                   1215: .pp
                   1216: A total of 16204 floating point operations were necessary to
                   1217: set up the matrix, solve for the coefficients and compute the
                   1218: conductivity.
                   1219: The operation count is roughly proportional to  m*n**2.
                   1220: The results obtained for sigma as a function of rho
                   1221: by this approach are essentially the
                   1222: same as those obtained by the finite difference technique
                   1223: of Keller and Sachs, but the computational effort involved
                   1224: is much less.
                   1225: .bp
                   1226: 8.  Eigenvalue sensitivity example
                   1227:   
                   1228: .pp
                   1229: In this example, we construct a matrix whose eigenvalues
                   1230: are moderately sensitive to perturbations and then analyze
                   1231: that sensitivity.  
                   1232: We begin with the statement
                   1233:      
                   1234:    B = <3 0 7; 0 2 0; 0 0 1>
                   1235:    
                   1236: which produces
                   1237:   
                   1238:    B     =
                   1239:    
                   1240:        3.    0.    7.
                   1241:        0.    2.    0.
                   1242:        0.    0.    1.
                   1243:    
                   1244: .pp
                   1245: Obviously, the eigenvalues of B are 1, 2 and 3 .
                   1246: Moreover, since B is not symmetric,
                   1247: these eigenvalues are slightly sensitive to perturbation.
                   1248: (The value b(1,3) = 7 was chosen so that the elements
                   1249: of the matrix A below are less than 1000.)
                   1250: .pp
                   1251: We now generate a similarity transformation to
                   1252: disguise the eigenvalues and make them more sensitive.
                   1253:   
                   1254:    L = <1 0 0; 2 1 0; -3 4 1>, M = L\\L'
                   1255:    
                   1256:    L     =
                   1257:    
                   1258:        1.    0.    0.
                   1259:        2.    1.    0.
                   1260:       -3.    4.    1.
                   1261:    
                   1262:    M     =
                   1263:    
                   1264:        1.0000    2.0000   -3.0000
                   1265:       -2.0000   -3.0000   10.0000
                   1266:       11.0000   18.0000  -48.0000
                   1267:    
                   1268: The matrix M has determinant equal to 1 and is
                   1269: moderately badly conditioned.
                   1270: The similarity transformation is
                   1271:   
                   1272:    A = M*B/M
                   1273:    
                   1274:    A     =
                   1275:    
                   1276:      -64.0000   82.0000   21.0000
                   1277:      144.0000 -178.0000  -46.0000
                   1278:     -771.0000  962.0000  248.0000
                   1279:    
                   1280: Because  det(M) = 1 , the elements of  A  would be exact
                   1281: integers if there were no roundoff.
                   1282: So,
                   1283:    
                   1284:    A = round(A)
                   1285:    
                   1286:    A     =
                   1287:    
                   1288:      -64.   82.   21.
                   1289:      144. -178.  -46.
                   1290:     -771.  962.  248.
                   1291:    
                   1292: .pp
                   1293: This, then, is our test matrix.  We can now forget how
                   1294: it was generated and analyze its eigenvalues.
                   1295:   
                   1296:    <X,D> = eig(A)
                   1297:    
                   1298:    D     =
                   1299:    
                   1300:        3.0000    0.0000    0.0000
                   1301:        0.0000    1.0000    0.0000
                   1302:        0.0000    0.0000    2.0000
                   1303:    
                   1304:    X     =
                   1305:    
                   1306:        -.0891    3.4903   41.8091
                   1307:         .1782   -9.1284  -62.7136
                   1308:        -.9800   46.4473  376.2818
                   1309:    
                   1310: Since A is similar to B, its eigenvalues are also 1, 2 and 3.
                   1311: They happen to be computed in another order by the EISPACK subroutines.
                   1312: The fact that the columns of X, which are the eigenvectors,
                   1313: are so far from being orthonormal is our first indication that
                   1314: the eigenvalues are sensitive. 
                   1315: To see this sensitivity, we display more figures of the computed
                   1316: eigenvalues.
                   1317:    
                   1318:    long, diag(D)
                   1319:    
                   1320:    ANS   =
                   1321:    
                   1322:       2.999999999973599
                   1323:       1.000000000015625
                   1324:       2.000000000011505
                   1325:    
                   1326: We see that, on this computer, the last five significant figures are
                   1327: contaminated by roundoff error.  
                   1328: A somewhat superficial explanation of this is provided by
                   1329:    
                   1330:    short,  cond(X)
                   1331:    
                   1332:    ANS   =
                   1333:    
                   1334:       3.2216e+05
                   1335:    
                   1336: The condition number of X gives an upper bound for the relative error in
                   1337: the computed eigenvalues.
                   1338: However, this condition number is affected by scaling.
                   1339:   
                   1340:    X = X/diag(X(3,:)),  cond(X)
                   1341:    
                   1342:    X     =
                   1343:    
                   1344:         .0909     .0751     .1111
                   1345:        -.1818    -.1965    -.1667
                   1346:        1.0000    1.0000    1.0000
                   1347:    
                   1348:    ANS   =
                   1349:    
                   1350:       1.7692e+03
                   1351:    
                   1352: .pp
                   1353: Rescaling the eigenvectors so that their last components are
                   1354: all equal to one has two consequences.  
                   1355: The condition of X is decreased by over two orders of magnitude.
                   1356: (This is about the minimum condition that can be obtained by
                   1357: such diagonal scaling.)
                   1358: Moreover, it is now apparent that the three eigenvectors are
                   1359: nearly parallel.
                   1360: .pp
                   1361: More detailed information on the sensitivity of the individual
                   1362: eigenvalues involves the left eigenvectors.
                   1363:   
                   1364:    Y = inv(X'),  Y'*A*X
                   1365:    
                   1366:    Y     =
                   1367:    
                   1368:     -511.5000  259.5000  252.0000
                   1369:      616.0000 -346.0000 -270.0000
                   1370:      159.5000  -86.5000  -72.0000
                   1371:    
                   1372:    ANS   =
                   1373:    
                   1374:        3.0000     .0000     .0000
                   1375:         .0000    1.0000     .0000
                   1376:         .0000     .0000    2.0000
                   1377:    
                   1378: We are now in a position to compute the sensitivities of the
                   1379: individual eigenvalues.
                   1380:   
                   1381:    for j = 1:3, c(j) = norm(Y(:,j))*norm(X(:,j)); end,  C
                   1382:    
                   1383:    C     =
                   1384:    
                   1385:      833.1092
                   1386:      450.7228
                   1387:      383.7564
                   1388:    
                   1389: These three numbers are the reciprocals of
                   1390: the cosines of the angles between the
                   1391: left and right eigenvectors.
                   1392: It can be shown that perturbation of the elements of A
                   1393: can result in a perturbation of the j-th eigenvalue which
                   1394: is c(j) times as large.
                   1395: In this example, the first eigenvalue has the largest sensitivity.
                   1396: .pp
                   1397: We now proceed to show that A is close to a matrix with
                   1398: a double eigenvalue.  The direction of the required perturbation
                   1399: is given by
                   1400:   
                   1401:    E = -1.e-6*Y(:,1)*X(:,1)'
                   1402:    
                   1403:    E     =
                   1404:    
                   1405:       1.0e-03 *
                   1406:    
                   1407:         .0465    -.0930     .5115
                   1408:        -.0560     .1120    -.6160
                   1409:        -.0145     .0290    -.1595
                   1410:    
                   1411: With some trial and error which we do not show, we bracket the point
                   1412: where two eigenvalues of a perturbed A coalesce and then become
                   1413: complex.
                   1414:   
                   1415:    eig(A + .4*E),  eig(A + .5*E)
                   1416:    
                   1417:    ANS   =
                   1418:    
                   1419:        1.1500
                   1420:        2.5996
                   1421:        2.2504
                   1422:    
                   1423:    ANS   =
                   1424:    
                   1425:       2.4067 +  .1753*i
                   1426:       2.4067 -  .1753*i
                   1427:       1.1866 + 0.0000*i
                   1428:    
                   1429: Now, a bisecting search, driven by the imaginary part of one
                   1430: of the eigenvalues, finds the point where two eigenvalues
                   1431: are nearly equal.
                   1432:   
                   1433:    r = .4;  s = .5;
                   1434:    
                   1435:    while s-r > 1.e-14, t = (r+s)/2; d = eig(A+t*E); ...
                   1436:      if imag(d(1))=0, r = t; else, s = t;
                   1437:   
                   1438:    long,  T
                   1439:    
                   1440:    T     =
                   1441:    
                   1442:         .450380734134507
                   1443:    
                   1444: .pp
                   1445: Finally, we display the perturbed matrix, which is obviously
                   1446: close to the original, and its pair of nearly equal eigenvalues.
                   1447: (We have dropped a few digits from the long output.)
                   1448:    
                   1449:    A+t*E,  eig(A+t*E)
                   1450:    
                   1451:    A
                   1452:    
                   1453:     -63.999979057   81.999958114   21.000230369
                   1454:     143.999974778 -177.999949557  -46.000277434
                   1455:    -771.000006530  962.000013061  247.999928164
                   1456:    
                   1457:    ANS   =
                   1458:    
                   1459:       2.415741150
                   1460:       2.415740621
                   1461:       1.168517777
                   1462:    
                   1463: .pp
                   1464: The first two eigenvectors of A + t*E
                   1465: are almost indistinguishable indicating that
                   1466: the perturbed matrix is almost defective.
                   1467:    
                   1468:    <X,D> = eig(A+t*E);  X = X/diag(X(3,:))
                   1469:    
                   1470:    X     =
                   1471: 
                   1472:        .096019578     .096019586    .071608466
                   1473:       -.178329614    -.178329608   -.199190520
                   1474:       1.000000000    1.000000000   1.000000000
                   1475: 
                   1476:    short,  cond(X)
                   1477:    
                   1478:    ANS   =
                   1479:    
                   1480:       3.3997e+09
                   1481:   
                   1482:   
                   1483: 9.  Syntax diagrams
                   1484: 
                   1485: .pp
                   1486: A formal description of the language acceptable to MATLAB,
                   1487: as well as a flow chart of the MATLAB program, is provided by
                   1488: the syntax diagrams or syntax graphs of Wirth [6].  There are
                   1489: eleven non-terminal symbols in the language:
                   1490: 
                   1491:    line, statement, clause, expression, term,
                   1492:    factor, number, integer, name, command, text .
                   1493: 
                   1494: The diagrams define each
                   1495: of the non-terminal symbols using the others and the terminal symbols:
                   1496: 
                   1497:    letter -- A through Z,
                   1498:    digit  -- 0 through 9,
                   1499:    char   -- ( ) ; : + - * / \\ = . , < >
                   1500:    quote  -- '
                   1501: 
                   1502: 
                   1503: .nf
                   1504: .ne 17
                   1505: line
                   1506: 
                   1507:        |-----> statement >----|
                   1508:        |                      |
                   1509:        |-----> clause >-------|
                   1510:        |                      |
                   1511: -------|-----> expr >---------|------>
                   1512:      | |                      | |
                   1513:      | |-----> command >------| |
                   1514:      | |                      | |
                   1515:      | |-> > >-> expr >-> < >-| |
                   1516:      | |                      | |
                   1517:      | |----------------------| |
                   1518:      |                          |
                   1519:      |        |-< ; <-|         |
                   1520:      |--------|       |---------|
                   1521:               |-< , <-|
                   1522: 
                   1523: 
                   1524: 
                   1525: 
                   1526: .ne 13
                   1527: statement
                   1528: 
                   1529:      |-> name >--------------------------------|
                   1530:      |          |                              |
                   1531:      |          |         |--> : >---|         |
                   1532:      |          |         |          |         |
                   1533:      |          |-> ( >---|-> expr >-|---> ) >-|
                   1534:      |                  |              |       |
                   1535: -----|                  |-----< , <----|       |--> = >--> expr >--->
                   1536:      |                                         |
                   1537:      |       |--< , <---|                      |
                   1538:      |       |          |                      |
                   1539:      |-> < >---> name >---> > >----------------|
                   1540: 
                   1541: 
                   1542: 
                   1543: 
                   1544: .ne 14
                   1545: clause
                   1546: 
                   1547:      |---> FOR   >---> name >---> = >---> expr >--------------|
                   1548:      |                                                        |
                   1549:      | |-> WHILE >-|                                          |
                   1550:      |-|           |-> expr >----------------------           |
                   1551:      | |-> IF    >-|          |   |   |   |   |   |           |
                   1552: -----|                        <   <=  =   <>  >=  >           |---->
                   1553:      |                        |   |   |   |   |   |           |
                   1554:      |                        ----------------------> expr >--|
                   1555:      |                                                        |
                   1556:      |---> ELSE  >--------------------------------------------|
                   1557:      |                                                        |
                   1558:      |---> END   >--------------------------------------------|
                   1559: 
                   1560: 
                   1561: 
                   1562: 
                   1563: .ne 11
                   1564: expr
                   1565: 
                   1566:        |-> + >-|
                   1567:        |       |
                   1568: -------|-------|-------> term >---------->
                   1569:        |       |    |             |
                   1570:        |-> - >-|    |  |-< + <-|  |
                   1571:                     |  |       |  |
                   1572:                     |--|-< - <-|--|
                   1573:                        |       |
                   1574:                        |-< : <-|
                   1575: 
                   1576: 
                   1577: 
                   1578: 
                   1579: .ne 9
                   1580: term
                   1581: 
                   1582: ---------------------> factor >---------------------->
                   1583:         |                                   |
                   1584:         |             |-< * <-|             |
                   1585:         |  |-------|  |       |  |-------|  |
                   1586:         |--|       |--|-< / <-|--|       |--|
                   1587:            |-< . <-|  |       |  |-< . <-|
                   1588:                       |-< \\ <-|
                   1589: 
                   1590: 
                   1591: 
                   1592: 
                   1593: .ne 29
                   1594: factor
                   1595: 
                   1596:      |----------------> number >---------------|
                   1597:      |                                         |
                   1598:      |-> name >--------------------------------|
                   1599:      |          |                              |
                   1600:      |          |         |--> : >---|         |
                   1601:      |          |         |          |         |
                   1602:      |          |-> ( >---|-> expr >-|---> ) >-|
                   1603:      |                  |              |       |
                   1604:      |                  |-----< , <----|       |
                   1605:      |                                         |
                   1606: -----|------------> ( >-----> expr >-----> ) >-|-|-------|----->
                   1607:      |                                         | |       | |
                   1608:      |                  |--------------|       | |-> ' >-| |
                   1609:      |                  |              |       |           |
                   1610:      |------------> < >-|---> expr >---|-> > >-|           |
                   1611:      |                    |          |         |           |
                   1612:      |                    |--<   <---|         |           |
                   1613:      |                    |          |         |           |
                   1614:      |                    |--< ; <---|         |           |
                   1615:      |                    |          |         |           |
                   1616:      |                    |--< , <---|         |           |
                   1617:      |                                         |           |
                   1618:      |------------> > >-----> expr >-----> < >-|           |
                   1619:      |                                         |           |
                   1620:      |-----> factor >---> ** >---> factor >----|           |
                   1621:      |                                                     |
                   1622:      |------------> ' >-----> text >-----> ' >-------------|
                   1623: 
                   1624: 
                   1625: 
                   1626: 
                   1627: .ne 9
                   1628: number
                   1629: 
                   1630:     |----------|                          |-> + >-|
                   1631:     |          |                          |       |
                   1632: -----> int >-----> . >---> int >-----> E >---------> int >---->
                   1633:              |                   | |      |       |        |
                   1634:              |                   | |      |-> - >-|        |
                   1635:              |                   | |                       |
                   1636:              |---------------------------------------------|
                   1637: 
                   1638: 
                   1639: 
                   1640: 
                   1641: .ne 5
                   1642: int
                   1643: 
                   1644: ------------> digit >----------->
                   1645:           |           |
                   1646:           |-----------|
                   1647: 
                   1648: 
                   1649: 
                   1650: 
                   1651: .ne 7
                   1652: name
                   1653: 
                   1654:                   |--< letter <--|
                   1655:                   |              |
                   1656: ------> letter >--|--------------|----->
                   1657:                   |              |
                   1658:                   |--< digit  <--|
                   1659: 
                   1660: 
                   1661: 
                   1662: 
                   1663: .ne 9
                   1664: command
                   1665: 
                   1666:                         |--> name >--|
                   1667:                         |            |
                   1668: --------> name >--------|------------|---->
                   1669:                         |            |
                   1670:                         |--> char >--|
                   1671:                         |            |
                   1672:                         |---> ' >----|
                   1673: 
                   1674: .ne 11
                   1675: text
                   1676: 
                   1677:                 |-> letter >--|
                   1678:                 |             |
                   1679:                 |-> digit >---|
                   1680: ----------------|             |-------------->
                   1681:             |   |-> char >----|   |
                   1682:             |   |             |   |
                   1683:             |   |-> ' >-> ' >-|   |
                   1684:             |                     |
                   1685:             |---------------------|
                   1686: 
                   1687: .fi
                   1688: 
                   1689: 10.  The parser-interpreter
                   1690: 
                   1691: .pp
                   1692: The structure of the parser-interpreter is similar to that
                   1693: of Wirth's compiler [6] for his simple language, PL/0 , except that
                   1694: MATLAB is programmed in Fortran, which does not have explicit
                   1695: recursion.  The interrelation of the primary subroutines is
                   1696: shown in the following diagram.
                   1697:   
                   1698: .ne 48
                   1699:       MAIN
                   1700:         |
                   1701:       MATLAB    |--CLAUSE
                   1702:         |       |    |
                   1703:       PARSE-----|--EXPR----TERM----FACTOR
                   1704:                 |    |       |       |
                   1705:                 |    |-------|-------|
                   1706:                 |    |       |       |
                   1707:                 |  STACK1  STACK2  STACKG
                   1708:                 |
                   1709:                 |--STACKP--PRINT
                   1710:                 |
                   1711:                 |--COMAND
                   1712:                 |
                   1713:                 |
                   1714:                 |          |--CGECO
                   1715:                 |          |
                   1716:                 |          |--CGEFA
                   1717:                 |          |
                   1718:                 |--MATFN1--|--CGESL
                   1719:                 |          |
                   1720:                 |          |--CGEDI
                   1721:                 |          |
                   1722:                 |          |--CPOFA
                   1723:                 |
                   1724:                 |
                   1725:                 |          |--IMTQL2
                   1726:                 |          |
                   1727:                 |          |--HTRIDI
                   1728:                 |          |
                   1729:                 |--MATFN2--|--HTRIBK
                   1730:                 |          |
                   1731:                 |          |--CORTH
                   1732:                 |          |
                   1733:                 |          |--COMQR3
                   1734:                 |
                   1735:                 |
                   1736:                 |--MATFN3-----CSVDC
                   1737:                 |
                   1738:                 |
                   1739:                 |          |--CQRDC
                   1740:                 |--MATFN4--|
                   1741:                 |          |--CQRSL
                   1742:                 |
                   1743:                 |
                   1744:                 |          |--FILES
                   1745:                 |--MATFN5--|
                   1746:                            |--SAVLOD
                   1747: .pp
                   1748: Subroutine PARSE controls the interpretation of each statement.
                   1749: It calls subroutines that process the various syntactic quantities
                   1750: such as command, expression, term and factor.  A fairly simple
                   1751: program stack mechanism allows these subroutines to recursively
                   1752: "call" each other along the lines allowed by the syntax diagrams.
                   1753: The four STACK subroutines manage the variable memory and perform
                   1754: elementary operations, such as matrix addition and transposition.
                   1755: .pp
                   1756: The four subroutines MATFN1 though MATFN4 are called
                   1757: whenever "serious" matrix computations are required.  They
                   1758: are interface routines which call the various LINPACK and
                   1759: EISPACK subroutines.  MATFN5 primarily handles the file
                   1760: access tasks.
                   1761: .pp
                   1762: Two large real arrays, STKR and STKI, are used to store all the
                   1763: matrices.  Four integer arrays are used to store the names, the row
                   1764: and column dimensions, and the pointers into the real stacks.
                   1765: The following diagram illustrates this storage scheme.
                   1766: .sp 1
                   1767: .ll 75
                   1768: .ne 34
                   1769: .nf
                   1770: TOP         IDSTK     MSTK NSTK LSTK               STKR       STKI
                   1771:  --      -- -- -- --   --   --   --              --------   --------
                   1772: |  |--->|  |  |  |  | |  | |  | |  |----------->|        | |        |
                   1773:  --      -- -- -- --   --   --   --              --------   --------
                   1774:         |  |  |  |  | |  | |  | |  |            |        | |        |
                   1775:          -- -- -- --   --   --   --              --------   --------
                   1776:               .         .    .    .                  .          .
                   1777:               .         .    .    .                  .          .
                   1778:               .         .    .    .                  .          .
                   1779:          -- -- -- --   --   --   --              --------   --------
                   1780: BOT     |  |  |  |  | |  | |  | |  |            |        | |        |
                   1781:  --      -- -- -- --   --   --   --              --------   --------
                   1782: |  |--->| X|  |  |  | | 2| | 1| |  |----------->|  3.14  | |  0.00  |
                   1783:  --      -- -- -- --   --   --   --              --------   --------
                   1784:         | A|  |  |  | | 2| | 2| |  |---------   |  0.00  | |  1.00  |
                   1785:          -- -- -- --   --   --   --          \\   --------   --------
                   1786:         | E| P| S|  | | 1| | 1| |  |-------   ->| 11.00  | |  0.00  |
                   1787:          -- -- -- --   --   --   --        \\     --------   --------
                   1788:         | F| L| O| P| | 1| | 2| |  |------  \\   | 21.00  | |  0.00  |
                   1789:          -- -- -- --   --   --   --       \\  \\   --------   --------
                   1790:         | E| Y| E|  | |-1| |-1| |  |---    \\ |  | 12.00  | |  0.00  |
                   1791:          -- -- -- --   --   --   --    \\   | |   --------   --------
                   1792:         | R| A| N| D| | 1| | 1| |  |-   \\  | |  | 22.00  | |  0.00  |
                   1793:          -- -- -- --   --   --   --  \\  |  \\ \\   --------   --------
                   1794:                                      |  \\   \\ ->| 1.E-15 | |  0.00  |
                   1795:                                      \\   \\   \\   --------   --------
                   1796:                                       \\   \\   ->|  0.00  | |  0.00  |
                   1797:                                        \\   \\     --------   --------
                   1798:                                         \\   \\   |  0.00  | |  0.00  |
                   1799:                                          \\   \\   --------   --------
                   1800:                                           \\   ->|  1.00  | |  0.00  |
                   1801:                                            \\     --------   --------
                   1802:                                             --->| URAND  | |  0.00  |
                   1803:                                                  --------   --------
                   1804: .fi
                   1805: .ll
                   1806: .pp
                   1807: The top portion of the stack is used for temporary variables
                   1808: and the bottom portion for saved variables.  The figure shows the
                   1809: situation after the line
                   1810: 
                   1811:    A = <11,12; 21,22>,  x = <3.14, sqrt(-1)>'
                   1812: 
                   1813: has been processed.  The four permanent names, EPS, FLOP, RAND and EYE,
                   1814: occupy the last four positions of the variable stacks.  RAND
                   1815: has dimensions 1 by 1, but whenever its value is requested,
                   1816: a random number generator is used instead.  EYE has dimensions
                   1817: -1 by -1 to indicate that the actual dimensions must be
                   1818: determined later by context.  The two saved variables have
                   1819: dimensions 2 by 2 and 2 by 1 and so take up a total of 6
                   1820: locations.
                   1821: .pp
                   1822: Subsequent statements involving A and x will result in
                   1823: temporary copies being made in the top of the stack for use in
                   1824: the actual calculations.  Whenever the top of the stack reaches
                   1825: the bottom, a message indicating memory has been
                   1826: exceeded is printed, but the current variables are not
                   1827: affected.
                   1828: .pp
                   1829: This modular structure makes it possible to implement
                   1830: MATLAB on a system with a limited amount of memory.  The object
                   1831: code for the MATFN's and the LINPACK-EISPACK subroutines
                   1832: is rarely needed.  Although it is not standard, many Fortran
                   1833: operating systems provide some overlay mechanism so that
                   1834: this code is brought into the main memory only when required.
                   1835: The variables, which occupy a relatively small portion of the
                   1836: memory, remain in place, while the subroutines which process
                   1837: them are loaded a few at a time.
                   1838: 
                   1839: 
                   1840: 11.  The numerical algorithms
                   1841: 
                   1842: .pp
                   1843: The algorithms underlying the basic MATLAB functions are
                   1844: described in the LINPACK and EISPACK guides [1-3].   
                   1845: The following list gives the subroutines used by these functions.
                   1846: 
                   1847:    INV(A)          - CGECO,CGEDI
                   1848:    DET(A)          - CGECO,CGEDI
                   1849:    LU(A)           - CGEFA
                   1850:    RCOND(A)        - CGECO
                   1851:    CHOL(A)         - CPOFA
                   1852:    SVD(A)          - CSVDC
                   1853:    COND(A)         - CSVDC
                   1854:    NORM(A,2)       - CSVDC
                   1855:    PINV(A,eps)     - CSVDC
                   1856:    RANK(A,eps)     - CSVDC
                   1857:    QR(A)           - CQRDC,CQRSL
                   1858:    ORTH(A)         - CQRDC,CSQSL
                   1859:    A\\B and B/A     - CGECO,CGESL if A is square.
                   1860:                    - CQRDC,CQRSL if A is not square.
                   1861:    EIG(A)          - HTRIDI,IMTQL2,HTRIBK if A is Hermitian.
                   1862:                    - CORTH,COMQR2         if A is not Hermitian.
                   1863:    SCHUR(A)        - same as EIG.
                   1864:    HESS(A)         - same as EIG.
                   1865: 
                   1866: .pp
                   1867: Minor modifications were made to all these subroutines.  The LINPACK
                   1868: routines were changed to replace the Fortran complex arithmetic with
                   1869: explicit references to real and imaginary parts.  Since most of the
                   1870: floating point arithmetic is concentrated in a few low-level subroutines
                   1871: which perform vector operations (the Basic Linear Algebra Subprograms),
                   1872: this was not an extensive change.  It also facilitated implementation
                   1873: of the FLOP and CHOP features which count and optionally truncate each
                   1874: floating point operation.
                   1875: .pp
                   1876: The EISPACK subroutine COMQR2 was modified to allow access to the
                   1877: Schur triangular form, ordinarily just an intermediate result.  IMTQL2
                   1878: was modified to make computation of the eigenvectors optional.  Both
                   1879: subroutines were modified to eliminate the machine-dependent accuracy
                   1880: parameter and all the EISPACK subroutines were changed to include FLOP
                   1881: and CHOP.
                   1882: .pp
                   1883: The algorithms employed for the POLY and ROOTS functions illustrate
                   1884: an interesting aspect of the modern approach to eigenvalue computation.
                   1885: POLY(A) generates the characteristic polynomial of A and ROOTS(POLY(A))
                   1886: finds the roots of that polynomial, which are, of course, the eigenvalues
                   1887: of A .  
                   1888: But both POLY and ROOTS use EISPACK eigenvalues subroutines,
                   1889: which are based on similarity transformations.
                   1890: So the classical approach which characterizes
                   1891: eigenvalues as roots of the characteristic polynomial is actually
                   1892: reversed.
                   1893: .pp
                   1894: If A is an n by n matrix, POLY(A) produces the coefficients
                   1895: C(1) through C(n+1), with C(1) = 1, in
                   1896: 
                   1897:       DET(z*EYE-A) = C(1)*z**n + ... + C(n)*z + C(n+1) .
                   1898: 
                   1899: The algorithm can be expressed compactly using MATLAB:
                   1900: 
                   1901:       Z = EIG(A);
                   1902:       C = 0*ONES(n+1,1);  C(1) = 1;
                   1903:       for j = 1:n, C(2:j+1) = C(2:j+1) - Z(j)*C(1:j);
                   1904:       C
                   1905: 
                   1906: This recursion is easily derived by expanding the product
                   1907: 
                   1908:       (z - z(1))*(z - z(2))* ... * (z-z(n)) .
                   1909: 
                   1910: It is possible to prove that POLY(A) produces the coefficients in the
                   1911: characteristic polynomial of a matrix within roundoff error of  A .
                   1912: This is true even if the eigenvalues of A are badly conditioned.
                   1913: The traditional algorithms for obtaining the characteristic polynomial
                   1914: which do not use the eigenvalues do not have such satisfactory numerical
                   1915: properties.
                   1916: .pp
                   1917: If C is a vector with n+1 components, ROOTS(C) finds the roots
                   1918: of the polynomial of degree n ,
                   1919: 
                   1920:        p(z) = C(1)*z**n + ... + C(n)*z + C(n+1) .
                   1921: 
                   1922: The algorithm simply involves computing the eigenvalues of the companion
                   1923: matrix:
                   1924: 
                   1925:       A = 0*ONES(n,n)
                   1926:       for j = 1:n, A(1,j) = -C(j+1)/C(1);
                   1927:       for i = 2:n, A(i,i-1) = 1;
                   1928:       EIG(A)
                   1929: 
                   1930: It is possible to prove that the results produced are the exact eigenvalues
                   1931: of a matrix within roundoff error of the companion matrix A, but this does
                   1932: not mean that they are the exact roots of a polynomial with coefficients
                   1933: within roundoff error of those in C .  There are more accurate, more
                   1934: efficient methods for finding polynomial roots, but this approach has the
                   1935: crucial advantage that it does not require very much additional code.
                   1936: .pp
                   1937: The elementary functions EXP, LOG, SQRT, SIN, COS and ATAN
                   1938: are applied to square matrices by diagonalizing the matrix, applying
                   1939: the functions to the individual eigenvalues and then transforming
                   1940: back.  For example, EXP(A) is computed by
                   1941: 
                   1942:       <X,D> = EIG(A);
                   1943:       for j = 1:n, D(j,j) = EXP(D(j,j));
                   1944:       X*D/X
                   1945: 
                   1946: This is essentially method number 14 out of the 19 'dubious'
                   1947: possibilities described in [8].  It is dubious because it doesn't
                   1948: always work.  The matrix of eigenvectors X can be arbitrarily badly
                   1949: conditioned and all accuracy lost in the computation of X*D/X.
                   1950: A warning message is printed if RCOND(X) is very small, but this
                   1951: only catches the extreme cases.  An example of a case not detected
                   1952: is when A has a double eigenvalue, but theoretically only one linearly
                   1953: independent eigenvector associated with it.  The computed eigenvalues
                   1954: will be separated by something on the order of the square root of
                   1955: the roundoff level.  This separation will be reflected in RCOND(X)
                   1956: which will probably not be small enough to trigger the error message.
                   1957: The computed EXP(A) will be accurate to only half precision.  Better
                   1958: methods are known for computing EXP(A), but they do not easily extend
                   1959: to the other five functions and would require a considerable amount
                   1960: of additional code.
                   1961: .pp
                   1962: The expression A**p is evaluated by repeated multiplication if
                   1963: p is an integer greater than 1.  Otherwise it is evaluated by
                   1964: 
                   1965:       <X,D> = EIG(A);
                   1966:       for j = 1:n, D(j,j) = EXP(p*LOG(D(j,j)))
                   1967:       X*D/X
                   1968: 
                   1969: This suffers from the same potential loss of accuracy if X is badly
                   1970: conditioned.  It was partly for this reason that the case p = 1 is
                   1971: included in the general case.  Comparison of A**1 with A gives some
                   1972: idea of the loss of accuracy for other values of p and for the
                   1973: elementary functions.
                   1974: .pp
                   1975: RREF, the reduced row echelon form, is of some interest in
                   1976: theoretical linear algebra, although it has little computational
                   1977: value.  It is included in MATLAB for pedagogical reasons.  The
                   1978: algorithm is essentially Gauss-Jordan elimination with detection
                   1979: of negligible columns applied to rectangular matrices.
                   1980: .pp
                   1981: There are three separate places in MATLAB where the rank of a
                   1982: matrix is implicitly computed:
                   1983: in RREF(A), in A\\B for non-square A, and in
                   1984: the pseudoinverse PINV(A).  Three different algorithms with three
                   1985: different criteria for negligibility are used and so it is possible
                   1986: that three different values could be produced for the same matrix.
                   1987: With RREF(A), the rank of A is the number of nonzero rows.  The
                   1988: elimination algorithm used for RREF is the fastest of the three
                   1989: rank-determining algorithms, but it is the least sophisticated
                   1990: numerically and the least reliable.  With A\\B, the algorithm is
                   1991: essentially that used by example subroutine SQRST in chapter 9 of the
                   1992: LINPACK guide.  With PINV(A), the algorithm is based on the singular
                   1993: value decomposition and is described in chapter 11 of the LINPACK
                   1994: guide.  The SVD algorithm is the most time-consuming, but the most
                   1995: reliable and is therefore also used for RANK(A).
                   1996: .pp
                   1997: The uniformly distributed random numbers in RAND are
                   1998: obtained from the machine-independent random number generator
                   1999: URAND described in [9].  It is possible to switch to normally
                   2000: distributed random numbers, which are obtained using a transformation
                   2001: also described in [9].
                   2002: .pp
                   2003: The computation of
                   2004: .sp
                   2005:                 2    2
                   2006:           sqrt(a  + b )
                   2007: .sp
                   2008: is required in many matrix algorithms, particularly those involving
                   2009: complex arithmetic.
                   2010: A new approach to carrying out this operation is described by
                   2011: Moler and Morrison [10].
                   2012: It is a cubically convergent algorithm which starts with  a  and  b ,
                   2013: rather than with their squares, and thereby avoids destructive arithmetic
                   2014: underflows and overflows.
                   2015: In MATLAB, the algorithm is used for complex modulus, Euclidean vector
                   2016: norm, plane rotations, and the shift calculation in the eigenvalue
                   2017: and singular value iterations.
                   2018:   
                   2019:   
                   2020: 12.  FLOP and CHOP
                   2021: .pp
                   2022: Detailed information about the amount of work involved
                   2023: in matrix calculations and the resulting accuracy
                   2024: is provided by FLOP and CHOP.
                   2025: The basic unit of work is the "flop", or floating point operation.
                   2026: Roughly, one flop is one execution of a Fortran statement like
                   2027: 
                   2028:       S = S + X(I)*Y(I)
                   2029:   
                   2030: or
                   2031:    
                   2032:       Y(I) = Y(I) + T*X(I)
                   2033:   
                   2034: In other words, it consists of one floating point multiplication,
                   2035: together with one floating point addition and the associated indexing and
                   2036: storage reference operations.
                   2037: .pp
                   2038: MATLAB will print the number
                   2039: of flops required for a particular statement when
                   2040: the statement is terminated by an extra comma.  For example, the line
                   2041:   
                   2042:       n = 20;  RAND(n)*RAND(n);,
                   2043:   
                   2044: ends with an extra comma.  Two 20 by 20 random matrices are generated
                   2045: and multiplied together.  The result is assigned to ANS, but
                   2046: the semicolon suppresses its printing.
                   2047: The only output is
                   2048:   
                   2049:         8800 flops
                   2050:   
                   2051: This is  n**3 + 2*n**2  flops,  n**2  for each random matrix and
                   2052: n**3 for the product.
                   2053: .pp
                   2054: FLOP is a predefined vector with two components.
                   2055: FLOP(1) is the number of flops used by the most recently executed
                   2056: statement, except that statements with zero flops are ignored.
                   2057: For example, after executing the previous statement, 
                   2058:   
                   2059:       flop(1)/n**3
                   2060:   
                   2061: results in
                   2062:   
                   2063:       ANS   =
                   2064:   
                   2065:           1.1000
                   2066:   
                   2067: .pp
                   2068: FLOP(2) is the cumulative total of all the flops used since the
                   2069: beginning of the MATLAB session.
                   2070: The statement
                   2071:   
                   2072:       FLOP = <0 0>
                   2073:   
                   2074: resets the total.
                   2075: .pp
                   2076: There are several difficulties associated with keeping a precise
                   2077: count of floating point operations.  
                   2078: An addition or subtraction that is not paired with a multiplication
                   2079: is usually counted as a flop.  
                   2080: The same is true of an isolated multiplication that is not paired
                   2081: with an addition.
                   2082: Each floating point division counts as a flop.
                   2083: But the number of operations required by system dependent library
                   2084: functions such as square root cannot be counted, so most 
                   2085: elementary functions are arbitrarily counted as using only one flop.
                   2086: .pp
                   2087: The biggest difficulty occurs with complex arithmetic.
                   2088: Almost all operations on the real parts of matrices are counted.
                   2089: However, the operations on the complex parts of matrices are counted
                   2090: only when they involve nonzero elements.
                   2091: This means that simple operations on nonreal matrices require
                   2092: only about twice as many flops as the same operations on real matrices.
                   2093: This factor of two is not necessarily an accurate measure of the
                   2094: relative costs of real and complex arithmetic.
                   2095: .pp
                   2096: The result of each floating point operation may also be "chopped"
                   2097: to simulate a computer with a shorter word length.
                   2098: The details of this chopping operation depend upon the format
                   2099: of the floating point word.
                   2100: Usually, the fraction in the floating point word can be
                   2101: regarded as consisting of several octal or hexadecimal digits.
                   2102: The least significant of these digits can be set to zero
                   2103: by a logical masking operation.  Thus the statement
                   2104:   
                   2105:       CHOP(p)  
                   2106:   
                   2107: causes the  p  least significant octal or hexadecimal
                   2108: digits in the result of each floating point operation to be set to zero.
                   2109: For example, if the computer being used has an IBM 360 long
                   2110: floating point word with 14 hexadecimal digits in the
                   2111: fraction, then CHOP(8) results in simulation of a computer with only
                   2112: 6 hexadecimal digits in the fraction, i.e. a short floating point word.  
                   2113: On a computer such as the CDC 6600 with 16 octal digits, 
                   2114: CHOP(8) results in about the same accuracy because the remaining
                   2115: 8 octal digits represent the same number of bits as 6 hexadecimal digits.
                   2116: .pp
                   2117: Some idea of the effect of CHOP on any particular system can be
                   2118: obtained by executing the following statements.
                   2119:  
                   2120:       long,   t = 1/10
                   2121:       long z, t = 1/10
                   2122:       chop(8)
                   2123:       long,   t = 1/10
                   2124:       long z, t = 1/10
                   2125:   
                   2126: .pp
                   2127: The following Fortran subprograms illustrate more details of
                   2128: FLOP and CHOP.  
                   2129: The first subprogram is a simplified example of a system-dependent
                   2130: function used within MATLAB itself.  
                   2131: The common variable FLP is essentially the first component
                   2132: of the variable FLOP.
                   2133: The common variable CHP is initially zero, but it is set to  p  by
                   2134: the statement  CHOP(p).
                   2135: To shorten the DATA statement, we assume there are only 6 hexadecimal
                   2136: digits.
                   2137: We also assume an extension of Fortran that allows .AND. to be
                   2138: used as a binary operation between two real variables.
                   2139:   
                   2140: .nf
                   2141: .ne 12
                   2142:       REAL FUNCTION FLOP(X)
                   2143:       REAL X
                   2144:       INTEGER FLP,CHP
                   2145:       COMMON FLP,CHP
                   2146:       REAL MASK(5)
                   2147:       DATA MASK/ZFFFFFFF0,ZFFFFFF00,ZFFFFF000,ZFFFF0000,ZFFF00000/
                   2148:       FLP = FLP + 1
                   2149:       IF (CHP .EQ. 0) FLOP = X
                   2150:       IF (CHP .GE. 1 .AND. CHP .LE. 5) FLOP = X .AND. MASK(CHP)
                   2151:       IF (CHP .GE. 6) FLOP = 0.0
                   2152:       RETURN
                   2153:       END
                   2154:       
                   2155: .fi
                   2156: .pp
                   2157: The following subroutine illustrates a typical use of the previous
                   2158: function within MATLAB.  It is a simplified version of 
                   2159: the Basic Linear Algebra Subprogram that adds a scalar multiple
                   2160: of one vector to another.  We assume here that the vectors are
                   2161: stored with a memory increment of one.
                   2162: 
                   2163: .nf
                   2164: .ne 11
                   2165:       SUBROUTINE SAXPY(N,TR,TI,XR,XI,YR,YI)
                   2166:       REAL TR,TI,XR(N),XI(N),YR(N),YI(N),FLOP
                   2167:       IF (N .LE. 0) RETURN
                   2168:       IF (TR .EQ. 0.0 .AND. TI .EQ. 0.0) RETURN
                   2169:       DO 10 I = 1, N
                   2170:          YR(I) = FLOP(YR(I) + TR*XR(I) - TI*XI(I))
                   2171:          YI(I) = YI(I) + TR*XI(I) + TI*XR(I)
                   2172:          IF (YI(I) .NE. 0.0D0) YI(I) = FLOP(YI(I))
                   2173:    10 CONTINUE
                   2174:       RETURN
                   2175:       END
                   2176: .fi
                   2177:   
                   2178: .pp
                   2179: The saxpy operation is perhaps the most fundamental operation within
                   2180: LINPACK.
                   2181: It is used in the computation of the LU, the QR and the SVD factorizations,
                   2182: and in several other places.
                   2183: We see that adding a multiple of one vector with n components to another
                   2184: uses n flops if the vectors are real and between n and 2*n flops if the
                   2185: vectors have nonzero imaginary components.
                   2186: .pp
                   2187: The permanent MATLAB variable EPS is reset by the statement CHOP(p).
                   2188: Its new value is usually the smallest inverse power of two that
                   2189: satisfies the Fortran logical test
                   2190: 
                   2191:             FLOP(1.0+EPS) .GT. 1.0
                   2192:   
                   2193: However, if EPS had been directly reset to a larger value, the old
                   2194: value is retained.
                   2195:   
                   2196:   
                   2197:   
                   2198: 13.  Communicating with other programs
                   2199: .pp
                   2200: There are four different ways MATLAB can be used in conjunction
                   2201: with other programs:
                   2202:       -- USER,
                   2203:       -- EXEC,
                   2204:       -- SAVE and LOAD,
                   2205:       -- MATZ, CALL and RETURN .
                   2206: .pp
                   2207: Let us illustrate each of these by the following simple example.
                   2208:   
                   2209:       n = 6
                   2210:       for i = 1:n, for j = 1:n, a(i,j) = abs(i-j);
                   2211:       A
                   2212:       X = inv(A)
                   2213:   
                   2214: .pp
                   2215: The example  A  could be introduced into MATLAB by writing
                   2216: the following Fortran subroutine.
                   2217:   
                   2218:          SUBROUTINE USER(A,M,N,S,T)
                   2219:          DOUBLE PRECISION A(1),S,T
                   2220:          N = IDINT(A(1))
                   2221:          M = N
                   2222:          DO 10 J = 1, N
                   2223:          DO 10 I = 1, N
                   2224:             K = I + (J-1)*M
                   2225:             A(K) = IABS(I-J)
                   2226:       10 CONTINUE
                   2227:          RETURN
                   2228:          END
                   2229:   
                   2230: This subroutine should be compiled and linked into MATLAB in place
                   2231: of the original version of USER.  Then the MATLAB statements
                   2232:   
                   2233:       n = 6
                   2234:       A = user(n)
                   2235:       X = inv(A)
                   2236:    
                   2237: do the job.
                   2238: .pp
                   2239: The example A could be generated by storing the following
                   2240: text in a file named, say, EXAMPLE .
                   2241:   
                   2242:       for i = 1:n, for j = 1:n, a(i,j) = abs(i-j);
                   2243:   
                   2244: Then the MATLAB statements
                   2245:    
                   2246:       n = 6
                   2247:       exec('EXAMPLE',0)
                   2248:       X = inv(A)
                   2249:    
                   2250: have the desired effect.  The 0 as the optional second parameter
                   2251: of exec indicates that the text in the file should not be printed
                   2252: on the terminal.
                   2253: .pp
                   2254: The matrices A and X could also be stored in files.
                   2255: Two separate main programs would be involved.
                   2256: The first is:
                   2257:   
                   2258:          PROGRAM MAINA
                   2259:          DOUBLE PRECISION A(10,10)
                   2260:          N = 6
                   2261:          DO 10 J = 1, N
                   2262:          DO 10 I = 1, N
                   2263:             A(I,J) = IABS(I-J)
                   2264:       10 CONTINUE
                   2265:          OPEN(UNIT=1,FILE='A')
                   2266:          WRITE(1,101) N,N
                   2267:      101 FORMAT('A   ',2I4)
                   2268:          DO 20 J = 1, N
                   2269:             WRITE(1,102) (A(I,J),I=1,N)
                   2270:       20 CONTINUE
                   2271:      102 FORMAT(4Z18)
                   2272:          END
                   2273:    
                   2274: The OPEN statement may take different forms on different systems.
                   2275: It attaches Fortran logical unit number 1 to the file named A.
                   2276: The FORMAT number 102 may also be system dependent.  This particular
                   2277: one is appropriate for hexadecimal computers with an 8 byte 
                   2278: double precision floating point word.  Check, or modify, MATLAB
                   2279: subroutine SAVLOD.
                   2280: .pp
                   2281: After this program is executed, enter MATLAB and give the following
                   2282: statements:
                   2283:   
                   2284:       load('A')
                   2285:       X = inv(A)
                   2286:       save('X',X)
                   2287:    
                   2288: If all goes according to plan, this will read the matrix A from the
                   2289: file A, invert it, store the inverse in X and then write the matrix
                   2290: X on the file X .  The following program can then access X .
                   2291:   
                   2292:          PROGRAM MAINX
                   2293:          DOUBLE PRECISION X(10,10)
                   2294:          OPEN(UNIT=1,FILE='X')
                   2295:          REWIND 1
                   2296:          READ (1,101) ID,M,N
                   2297:      101 FORMAT(A4,2I4)
                   2298:          DO 10 J = 1, N
                   2299:             READ(1,102) (X(I,J),I=1,M)
                   2300:       10 CONTINUE
                   2301:      102 FORMAT(4Z18)
                   2302:          ...
                   2303:          ...
                   2304:   
                   2305: .pp
                   2306: The most elaborate mechanism involves using MATLAB as a
                   2307: subroutine within another program.  Communication with the
                   2308: MATLAB stack is accomplished using subroutine MATZ which is
                   2309: distributed with MATLAB, but which is not used by MATLAB itself.
                   2310: The preample of MATZ is:
                   2311:   
                   2312: .nf
                   2313:       SUBROUTINE MATZ(A,LDA,M,N,IDA,JOB,IERR)
                   2314:       INTEGER LDA,M,N,IDA(1),JOB,IERR
                   2315:       DOUBLE PRECISION A(LDA,N)
                   2316: C
                   2317: C     ACCESS MATLAB VARIABLE STACK
                   2318: C     A IS AN M BY N MATRIX, STORED IN AN ARRAY WITH
                   2319: C         LEADING DIMENSION LDA.
                   2320: C     IDA IS THE NAME OF A.
                   2321: C         IF IDA IS AN INTEGER K LESS THAN 10, THEN THE NAME IS 'A'K
                   2322: C         OTHERWISE, IDA(1:4) IS FOUR CHARACTERS, FORMAT 4A1.
                   2323: C     JOB =  0  GET REAL A FROM MATLAB,
                   2324: C         =  1  PUT REAL A INTO MATLAB,
                   2325: C         = 10  GET IMAG PART OF A FROM MATLAB,
                   2326: C         = 11  PUT IMAG PART OF A INTO MATLAB.
                   2327: C     RETURN WITH NONZERO IERR AFTER MATLAB ERROR MESSAGE.
                   2328: C
                   2329: C     USES MATLAB ROUTINES STACKG, STACKP AND ERROR
                   2330: .fi
                   2331:    
                   2332: .pp
                   2333: The preample of subroutine MATLAB is:
                   2334: 
                   2335:    
                   2336: .nf
                   2337:       SUBROUTINE MATLAB(INIT)
                   2338: C     INIT = 0 FOR FIRST ENTRY, NONZERO FOR SUBSEQUENT ENTRIES
                   2339: .fi
                   2340:   
                   2341: .pp
                   2342: To do our example, write the following program:
                   2343:   
                   2344:          DOUBLE PRECISION A(10,10),X(10,10)
                   2345:          INTEGER IDA(4),IDX(4)
                   2346:          DATA LDA/10/
                   2347:          DATA IDA/'A',' ',' ',' '/, IDX/'X',' ',' ',' '/
                   2348:          CALL MATLAB(0)
                   2349:          N = 6
                   2350:          DO 10 J = 1, N
                   2351:          DO 10 I = 1, N
                   2352:             A(I,J) = IABS(I-J)
                   2353:       10 CONTINUE
                   2354:          CALL MATZ(A,LDA,N,N,IDA,1,IERR)
                   2355:          IF (IERR .NE. 0) GO TO ...
                   2356:          CALL MATLAB(1)
                   2357:          CALL MATZ(X,LDA,N,N,IDX,0,IERR)
                   2358:          IF (IERR .NE. 0) GO TO ...
                   2359:          ...
                   2360:          ...
                   2361:   
                   2362: When this program is executed, the call to MATLAB(0)
                   2363: produces the MATLAB greeting, then waits for input.
                   2364: The command  
                   2365:    
                   2366:          return
                   2367:    
                   2368: sends control back to our example program.  The matrix A
                   2369: is generated by the program and sent to the stack by the
                   2370: first call to MATZ.  The call to MATLAB(1) produces the
                   2371: MATLAB prompt.  Then the statements
                   2372:    
                   2373:          X = inv(A)
                   2374:          return
                   2375:   
                   2376: will invert our matrix, put the result on the stack and go
                   2377: back to our program.  The second call to MATZ will retrieve X .
                   2378: .pp
                   2379: By the way, this matrix  X  is interesting.  
                   2380: Take a look at round(2*(n-1)*X).
                   2381: 
                   2382: 
                   2383: 
                   2384: 
                   2385: Acknowledgement.
                   2386: 
                   2387: .pp
                   2388: Most of the
                   2389: work on MATLAB has been carried out at the University of
                   2390: New Mexico, where it is being supported by the National Science Foundation. 
                   2391: Additional work has been done
                   2392: during visits to Stanford Linear Accelerator Center,
                   2393: Argonne National Laboratory and Los Alamos Scientific Laboratory,
                   2394: where support has been provided by NSF and
                   2395: the Department of Energy.
                   2396: 
                   2397: 
                   2398: References
                   2399: .in +5
                   2400: 
                   2401: .ti -5
                   2402: [1]  J. J. Dongarra, J. R. Bunch, C. B. Moler and G. W. Stewart,
                   2403: LINPACK Users' Guide, Society for Industrial and Applied
                   2404: Mathematics, Philadelphia, 1979.
                   2405: 
                   2406: .ti -5
                   2407: [2]  B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
                   2408: Y. Ikebe, V. C. Klema, C. B. Moler, Matrix Eigensystem
                   2409: Routines -- EISPACK Guide, Lecture Notes in Computer
                   2410: Science, volume 6, second edition, Springer-Verlag, 1976.
                   2411: 
                   2412: .ti -5
                   2413: [3]  B. S. Garbow, J. M. Boyle, J. J. Dongarra, C. B. Moler,
                   2414: Matrix Eigensystem Routines -- EISPACK Guide Extension,
                   2415: Lecture Notes in Computer Science, volume 51, Springer-Verlag,
                   2416: 1977.
                   2417: 
                   2418: .ti -5
                   2419: [4]  S. Cohen and S. Pieper, SPEAKEASY III Reference Manual,
                   2420: Speakeasy Computing Corp., Chicago, Ill., 1979.
                   2421: 
                   2422: .ti -5
                   2423: [5]  J. H. Wilkinson and C. Reinsch, Handbook for Automatic
                   2424: Computation, volume II, Linear Algebra, Springer-Verlag, 1971.
                   2425: 
                   2426: .ti -5
                   2427: [6]  Niklaus Wirth, Algorithms + Data Structures = Programs,
                   2428: Prentice-Hall, 1976.
                   2429: 
                   2430: .ti -5
                   2431: [7]  H. B. Keller and D. Sachs, 
                   2432: "Calculations of the Conductivity of a Medium Containing
                   2433: Cylindrical Inclusions",
                   2434: J. Applied Physics 35, 537-538, 1964.
                   2435:   
                   2436: .ti -5
                   2437: [8]  C. B. Moler and C. F. Van Loan, Nineteen Dubious Ways to Compute
                   2438: the Exponential of a Matrix, SIAM Review 20, 801-836, 1979.
                   2439: 
                   2440: .ti -5
                   2441: [9]  G. E. Forsythe, M. A. Malcolm and C. B. Moler, Computer Methods
                   2442: for Mathematical Computations, Prentice-Hall, 1977.
                   2443: 
                   2444: .ti -5
                   2445: [10] C. B. Moler and D. R. Morrison, "Replacing square roots by
                   2446: Pythagorean sums", University of New Mexico,
                   2447: Computer Science Department,
                   2448: technical report, submitted for publication, 1980.
                   2449: .in -5
                   2450: .bp
                   2451: Appendix.  The HELP document
                   2452: .in +6
                   2453: .xx
                   2454: NEWS``MATLAB NEWS dated May, 1981.
                   2455: .br
                   2456: This describes recent or local changes.
                   2457: .br
                   2458: The new features added since the November, 1980, printing of the
                   2459: Users' Guide include DIARY, EDIT, KRON, MACRO, PLOT, RAT, TRIL, TRIU and
                   2460: six element-by-element operations:
                   2461: .br
                   2462:       .*```./```.\\```.*.```./.```.\\.
                   2463: .br
                   2464: Some additional capabilities have been added to 
                   2465: EXIT, RANDOM, RCOND, SIZE and SVD.
                   2466: .xx
                   2467: INTRO`Welcome to MATLAB.
                   2468:    
                   2469: Here are a few sample statements:
                   2470:    
                   2471: .nf
                   2472: A = <1 2; 3 4>
                   2473: b = <5 6>'
                   2474: x = A\\b
                   2475: <V,D> = eig(A),  norm(A-V*D/V)
                   2476: help \\ , help eig
                   2477: exec('demo',7)
                   2478: .fi
                   2479:    
                   2480: For more information, see the MATLAB Users' Guide
                   2481: which is contained in file ...
                   2482: or may be obtained from ... .
                   2483: .xx
                   2484: HELP``HELP gives assistance.
                   2485: .br
                   2486: HELP HELP obviously prints this message.
                   2487: .br
                   2488: To see all the HELP messages, list the file ... .
                   2489: .xx
                   2490: <`````< > Brackets used in forming vectors and matrices.
                   2491: .br
                   2492: <6.9  9.64  SQRT(-1)>  is a vector with three elements
                   2493: separated by blanks.  <6.9, 9.64, sqrt(-1)> is the same thing.
                   2494: <1+I 2-I 3>  and  <1 +I 2 -I 3>  are not the same.  The first
                   2495: has three elements, the second has five.
                   2496: .br
                   2497: <11 12 13; 21 22 23>  is a 2 by 3 matrix .  The semicolon
                   2498: ends the first row.
                   2499: .sp
                   2500: Vectors and matrices can be used inside < > brackets.
                   2501: .br
                   2502: <A B; C>  is allowed if the number of rows of  A  equals
                   2503: the number of rows of  B  and the number of columns of  A  plus
                   2504: the number of columns of  B  equals the number of columns of  C .
                   2505: This rule generalizes in a hopefully obvious way to allow
                   2506: fairly complicated constructions.
                   2507: .sp
                   2508: A = < >  stores an empty matrix in  A , thereby removing it
                   2509: from the list of current variables.
                   2510: .sp
                   2511: For the use of < and > on the left of the = in multiple
                   2512: assignment statements, see LU, EIG, SVD and so on.
                   2513: .sp
                   2514: In WHILE and IF clauses, <> means less than or greater than,
                   2515: i.e. not equal, < means less than, > means greater than,
                   2516: <= means less than or equal, >= means greater than or equal.
                   2517: .sp
                   2518: For the use of > and < to delineate macros, see MACRO.
                   2519: .xx
                   2520: >`````See < .  Also see MACRO.
                   2521: .xx
                   2522: (`````( ) Used to indicate precedence in arithmetic expressions in
                   2523: the usual way.
                   2524: Used to enclose arguments of functions in the usual way.
                   2525: Used to enclose subscripts of vectors and matrices in a manner
                   2526: somewhat more general than the usual way.  If  X  and  V
                   2527: are vectors, then  X(V) is <X(V(1)), X(V(2)), ..., X(V(N))> .
                   2528: The components of  V  are rounded to nearest integers and
                   2529: used as subscripts.  An error occurs if any such subscript
                   2530: is less than 1 or greater than the dimension of  X .
                   2531: Some examples:
                   2532: .br
                   2533: X(3)  is the third element of  X .
                   2534: .br
                   2535: X(<1 2 3>)  is the first three elements of  X .  So is
                   2536: .br
                   2537: X(<SQRT(2), SQRT(3), 4*ATAN(1)>)  .
                   2538: .br
                   2539: If  X  has  N  components,  X(N:-1:1) reverses them.
                   2540: .br
                   2541: The same indirect subscripting is used in matrices.
                   2542: If  V  has  M  components and  W  has  N  components, then
                   2543: A(V,W)  is the  M by N  matrix formed from the elements of A
                   2544: whose subscripts are the elements of  V  and  W .
                   2545: For example...
                   2546: .br
                   2547: A(<1,5>,:) = A(<5,1>,:)  interchanges rows 1 and 5 of  A .
                   2548: .xx
                   2549: )`````See  ( .
                   2550: .xx
                   2551: =`````Used in assignment statements and to mean equality in
                   2552: WHILE and IF clauses.
                   2553: .xx
                   2554: .cc -
                   2555: .`````Decimal point.  314/100, 3.14  and  .314E1  are all the same.
                   2556: -cc
                   2557: .sp
                   2558: Element-by-element multiplicative operations are obtained
                   2559: using .* , ./ , or .\\ .  For example, C = A ./ B is the
                   2560: matrix with elements  c(i,j) = a(i,j)/b(i,j) .
                   2561: .sp
                   2562: Kronecker tensor products and quotients are obtained with .*. , ./.
                   2563: and .\\. .  See KRON.
                   2564: .sp
                   2565: Two or more points at the end of the line indicate continuation.
                   2566: The total line length limit is 1024 characters.
                   2567: .xx
                   2568: ,`````Used to separate matrix subscripts and function arguments.
                   2569: Used at the end of FOR, WHILE and IF clauses.
                   2570: Used to separate statements in multi-statement lines.  In this
                   2571: situation, it may be replaced by semicolon to suppress printing.
                   2572: .xx
                   2573: ;`````Used inside brackets to end rows.
                   2574: .br
                   2575: Used after an expression or statement to suppress printing.
                   2576: .br
                   2577: See SEMI.
                   2578: .xx
                   2579: \\`````Backslash or matrix left division.
                   2580: A\\B  is roughly the
                   2581: same as  INV(A)*B , except it is computed in a different way.
                   2582: If  A  is an N by N matrix and  B  is a column vector with N
                   2583: components, or a matrix with several such columns, then
                   2584: X = A\\B  is the solution to the equation  A*X = B  computed
                   2585: by Gaussian elimination.  A warning message is printed if  A
                   2586: is badly scaled or nearly singular.
                   2587: .br
                   2588: A\\EYE produces the inverse of  A .
                   2589: .sp
                   2590: If  A  is an  M by N  matrix with  M < or > N  and  B  is
                   2591: a column vector with  M  components, or a matrix with several
                   2592: such columns, then  X = A\\B  is the solution in the least
                   2593: squares sense to the under- or overdetermined system  of equations
                   2594: A*X = B .
                   2595: The effective rank, K, of  A  is determined from the QR
                   2596: decomposition with pivoting.  A solution  X  is computed which
                   2597: has at most K nonzero components per column.  If  K < N
                   2598: this will usually not be the same solution as PINV(A)*B .
                   2599: .br
                   2600: A\\EYE produces a generalized inverse of  A .
                   2601: .sp
                   2602: If A and B have the same dimensions, then A .\\ B has elements
                   2603: a(i,j)\\b(i,j) .
                   2604: .sp
                   2605: Also, see EDIT.
                   2606: .xx
                   2607: /`````Slash or matrix right division.  B/A  is roughly the same
                   2608: as  B*INV(A) .  More precisely,  B/A = (A'\\B')' .  See \\ .
                   2609: .sp
                   2610: IF A and B have the same dimensions, then A ./ B has elements
                   2611: a(i,j)/b(i,j) .
                   2612: .sp
                   2613: Two or more slashes together on a line indicate a logical
                   2614: end of line.  Any following text is ignored.
                   2615: .xx
                   2616: .c2 -
                   2617: '`````Transpose.  X'  is the complex conjugate transpose of  X .
                   2618: .c2
                   2619: Quote.  'ANY TEXT'  is a vector whose components are the
                   2620: MATLAB internal codes for the characters.
                   2621: '0' = 0, '1' = 1, 'A' = 10, 'Z' = 35, ';' = 53, and so on.
                   2622: A quote within the text is indicated by two quotes.
                   2623: See DISP and FILE .
                   2624: .xx
                   2625: +`````Addition.  X + Y .  X and Y must have the same dimensions.
                   2626: .xx
                   2627: -`````Subtraction.  X - Y .  X and Y must have the same dimensions.
                   2628: .xx
                   2629: *`````Matrix multiplication, X*Y .  Any scalar (1 by 1 matrix) may
                   2630: multiply anything.  Otherwise, the number of columns of  X
                   2631: must equal the number of rows of Y .
                   2632: .sp
                   2633: Element-by-element multiplication is obtained with X .* Y .
                   2634: .sp
                   2635: The Kronecker tensor product is denoted by X .*. Y .
                   2636: .sp
                   2637: Powers.  X**p  is  X  to the  p  power.  p  must be a scalar.
                   2638: If  X  is a matrix, see  FUN .
                   2639: .xx
                   2640: :`````Colon.  Used in subscripts, FOR iterations and possibly elsewhere.
                   2641: .br
                   2642: J:K  is the same as  <J, J+1, ..., K>
                   2643: .br
                   2644: J:K  is empty if  J > K .
                   2645: .br
                   2646: J:I:K  is the same as  <J, J+I, J+2I, ..., K>
                   2647: .br
                   2648: J:I:K  is empty if  I > 0 and J > K or if I < 0 and J < K .
                   2649: .br
                   2650: The colon notation can be used to pick out selected rows,
                   2651: columns and elements of vectors and matrices.
                   2652: .br
                   2653: A(:)  is all the elements of A, regarded as a single column.
                   2654: .br
                   2655: A(:,J)  is the  J-th  column of A
                   2656: .br
                   2657: A(J:K)  is  A(J),A(J+1),...,A(K)
                   2658: .br
                   2659: A(:,J:K)  is  A(:,J),A(:,J+1),...,A(:,K) and so on.
                   2660: .br
                   2661: For the use of the colon in the FOR statement, See FOR .
                   2662: .xx
                   2663: ABS```ABS(X)  is the absolute value, or complex modulus, of
                   2664: the elements of X .
                   2665: .xx
                   2666: ANS```Variable created automatically when expressions are not
                   2667: assigned to anything else.
                   2668: .xx
                   2669: ATAN``ATAN(X)  is the arctangent of  X .  See FUN .
                   2670: .xx
                   2671: BASE``BASE(X,B) is a vector containing the base B representation
                   2672: of  X .  This is often used in conjunction
                   2673: with DISPLAY.  
                   2674: DISPLAY(X,B) is the same as DISPLAY(BASE(X,B)).
                   2675: For example, DISP(4*ATAN(1),16) prints the
                   2676: hexadecimal representation of pi.
                   2677: .xx
                   2678: CHAR``CHAR(K) requests an input line containing a single character
                   2679: to replace MATLAB character number K in the following table.
                   2680: For example, CHAR(45) replaces backslash.
                   2681: CHAR(-K) replaces the alternate character number K.
                   2682: .sp
                   2683:           K  character alternate name
                   2684:         0 - 9   0 - 9    0 - 9   digits
                   2685:        10 - 35  A - Z    a - z   letters
                   2686:          36                      blank
                   2687:          37       (        (     lparen
                   2688:          38       )        )     rparen
                   2689:          39       ;        ;     semi
                   2690:          40       :        |     colon
                   2691:          41       +        +     plus
                   2692:          42       -        -     minus
                   2693:          43       *        *     star
                   2694:          44       /        /     slash
                   2695:          45       \\        $     backslash
                   2696:          46       =        =     equal
                   2697:          47       .        .     dot
                   2698:          48       ,        ,     comma
                   2699:          49       '        "     quote
                   2700:          50       <        [     less
                   2701:          51       >        ]     great
                   2702: .xx
                   2703: CHOL``Cholesky factorization.  CHOL(X)  uses only the diagonal and
                   2704: upper triangle of  X .  The lower triangular is assumed to be
                   2705: the (complex conjugate) transpose of the upper.
                   2706: If  X  is positive definite, then  R = CHOL(X)  produces an
                   2707: upper triangular  R  so that  R'*R = X .
                   2708: If  X  is not positive definite, an error message is printed.
                   2709: .xx
                   2710: CHOP``Truncate arithmetic.  CHOP(P) causes P places to be chopped
                   2711: off after each arithmetic operation in subsequent computations.
                   2712: This means P hexadecimal digits on some computers
                   2713: and P octal digits on others.
                   2714: CHOP(0) restores full precision.
                   2715: .xx
                   2716: CLEAR`Erases all variables, except EPS, FLOP, EYE and RAND.
                   2717: .br
                   2718: X = <>  erases only variable  X .
                   2719: So does CLEAR X .
                   2720: .xx
                   2721: COND``Condition number in 2-norm.  COND(X) is the ratio of the
                   2722: largest singular value of  X  to the smallest.
                   2723: .xx
                   2724: CONJG`CONJG(X)  is the complex conjugate of  X .
                   2725: .xx
                   2726: COS```COS(X)  is the cosine of  X .  See FUN .
                   2727: .xx
                   2728: DET```DET(X)  is the determinant of the square matrix  X .
                   2729: .xx
                   2730: DIAG``If  V  is a row or column vector with N components,
                   2731: DIAG(V,K)  is a square matrix of order  N+ABS(K)  with
                   2732: the elements of  V  on the K-th diagonal.
                   2733: K = 0 is the main diagonal, K > 0 is above the main diagonal
                   2734: and K < 0 is below the main diagonal.
                   2735: DIAG(V)  simply puts  V  on the main diagonal.
                   2736: .br
                   2737: eg. DIAG(-M:M) + DIAG(ONES(2*M,1),1) + DIAG(ONES(2*M,1),-1)
                   2738: .br
                   2739: produces a tridiagonal matrix of order 2*M+1 .
                   2740: .br
                   2741: IF  X  is a matrix,  DIAG(X,K)  is a column vector formed
                   2742: from the elements of the K-th diagonal of  X .
                   2743: .br
                   2744: DIAG(X)  is the main diagonal of  X .
                   2745: .br
                   2746: DIAG(DIAG(X))  is a diagonal matrix .
                   2747: .xx
                   2748: DIARY`DIARY('file') causes a copy of all subsequent terminal input
                   2749: and most of the resulting output to be written on the file. 
                   2750: DIARY(0) turns it off.  See FILE.
                   2751: .xx
                   2752: DISP``DISPLAY(X) prints X in a compact format.  If all the elements
                   2753: of X are integers between 0 and 51, then X is interpreted as MATLAB text
                   2754: and printed accordingly.  Otherwise, + , -  and blank are printed for
                   2755: positive, negative and zero elements.  Imaginary parts are ignored.
                   2756: .br
                   2757: DISP(X,B) is the same as DISP(BASE(X,B)).
                   2758: .xx
                   2759: EDIT``There are no editing features available on most installations and
                   2760: EDIT is not a command.  However, on a few systems a command line
                   2761: consisting of a single backslash \\ will cause the local file editor
                   2762: to be called with a copy of the previous input line.  When the
                   2763: editor returns control to MATLAB, it will execute the line again.
                   2764: .xx
                   2765: EIG```Eigenvalues and eigenvectors.
                   2766: .br
                   2767: EIG(X) is a vector containing
                   2768: the eigenvalues of a square matrix  X .
                   2769: .br
                   2770: <V,D> = EIG(X)  produces a diagonal matrix  D  of eigenvalues
                   2771: and a full matrix  V  whose columns are the corresponding
                   2772: eigenvectors so that  X*V = V*D .
                   2773: .xx
                   2774: ELSE``Used with IF .
                   2775: .xx
                   2776: END```Terminates the scope of FOR, WHILE and IF statements.
                   2777: Without END's, FOR and WHILE repeat all statements up to the
                   2778: end of the line.  Each END is paired with the closest previous
                   2779: unpaired FOR or WHILE and serves to terminate its scope.
                   2780: The line
                   2781: .br
                   2782: FOR I=1:N, FOR J=1:N, A(I,J)=1/(I+J-1); A
                   2783: .br
                   2784: would cause A to be printed  N**2  times, once for each
                   2785: new element.  On the other hand, the line
                   2786: .br
                   2787: FOR I=1:N, FOR J=1:N, A(I,J)=1/(I+J-1); END, END, A
                   2788: .br
                   2789: will lead to only the final printing of  A .
                   2790: .br
                   2791: Similar considerations apply to WHILE.
                   2792: .br
                   2793: EXIT terminates execution of loops or of MATLAB itself.
                   2794: .xx
                   2795: EPS```Floating point relative accuracy.  A permanent variable whose
                   2796: value is initially the distance from 1.0 to the next largest floating
                   2797: point number.  The value is changed by CHOP, and other values
                   2798: may be assigned.  EPS is used as a default tolerance by PINV and RANK.
                   2799: .xx
                   2800: EXEC``EXEC('file',k) obtains subsequent MATLAB input from an external
                   2801: file.  The printing of input is controlled by the optional parameter k .
                   2802: .br
                   2803: If k = 1 , the input is echoed.
                   2804: .br
                   2805: If k = 2 , the MATLAB prompt <> is printed.
                   2806: .br
                   2807: If k = 4 , MATLAB pauses before each prompt and waits for a null line
                   2808: to continue.
                   2809: .br
                   2810: If k = 0 , there is no echo, prompt or pause.
                   2811: This is the default if the
                   2812: exec command is followed by a semicolon.
                   2813: .br
                   2814: If k = 7 , there will be echos, prompts and pauses. This is useful
                   2815: for demonstrations on video terminals.  
                   2816: .br
                   2817: If k = 3 , there will be echos and prompts, but no pauses.  
                   2818: This is the the default if the exec command
                   2819: is not followed by a semicolon.
                   2820: .br
                   2821: EXEC(0) causes subsequent input to be obtained from the terminal.  
                   2822: An end-of-file has the same effect.
                   2823: .br
                   2824: EXEC's may be nested, i.e. the text in the file may contain EXEC of
                   2825: another file.  EXEC's may also be driven by FOR and WHILE loops.
                   2826: .xx
                   2827: EXIT``Causes termination of a FOR or WHILE loop.
                   2828: .br
                   2829: If not in a loop, terminates execution of MATLAB.
                   2830: .xx
                   2831: EXP```EXP(X)  is the exponential of  X ,  e  to the X .  See FUN .
                   2832: .xx
                   2833: EYE```Identity matrix.
                   2834: EYE(N) is the N by N identity matrix.
                   2835: EYE(M,N)  is an M by N matrix with 1's on the diagonal and
                   2836: zeros elsewhere.
                   2837: EYE(A)  is the same size as  A .
                   2838: EYE  with no arguments is an identity matrix of whatever
                   2839: order is appropriate in the context.  For example,
                   2840: A + 3*EYE  adds  3  to each diagonal element of  A .
                   2841: .xx
                   2842: FILE``The EXEC, SAVE, LOAD, PRINT and DIARY functions access files.
                   2843: The 'file' parameter takes different forms for different
                   2844: operating systems.
                   2845: On most systems, 'file' may be a string of up to 32 characters
                   2846: in quotes.  For example,
                   2847: SAVE('A') or EXEC('matlab/demo.exec') .
                   2848: The string will be used as the name of a file in the local operating system.
                   2849: .br
                   2850: On all systems, 'file' may be a positive integer  k  less than 10 which
                   2851: will be used as a FORTRAN logical unit number.  
                   2852: Some systems then automatically access a file with a name like
                   2853: FORT.k or FORk.DAT.  
                   2854: Other systems require a file with a name like FT0kF001 to be assigned to
                   2855: unit  k  before MATLAB is executed.  
                   2856: Check your local installation for details.
                   2857: .xx
                   2858: FLOPS`Count of floating point operations.
                   2859: .br
                   2860: FLOPS is a permanently defined row vector with two elements.
                   2861: FLOPS(1) is the number of floating point operations counted
                   2862: during the previous statement.  FLOPS(2) is a cumulative total.
                   2863: FLOPS can be used in the same way as any other vector.
                   2864: FLOPS(2) = 0 resets the cumulative total.
                   2865: In addition, FLOPS(1) will be printed whenever a statement
                   2866: is terminated by an extra comma.  For example,
                   2867: .br
                   2868: X = INV(A);,
                   2869: .br
                   2870: or
                   2871: .br
                   2872: COND(A),   (as the last statement on the line).
                   2873: .br
                   2874: HELP FLPS gives more details.
                   2875: .xx
                   2876: FLPS``More detail on FLOPS.
                   2877: .br
                   2878: It is not feasible to count absolutely all floating point
                   2879: operations, but most of the important ones are counted.
                   2880: Each multiply and add in a real vector operation such as
                   2881: a dot product or a 'saxpy' counts one flop.  Each multiply
                   2882: and add in a complex vector operation counts two flops.
                   2883: Other additions, subtractions and multiplications count
                   2884: one flop each if the result is real and two flops if it is not.
                   2885: Real divisions count one and complex divisions count two.
                   2886: Elementary functions count one if real and two if complex.
                   2887: Some examples.  If A and B are real N by N matrices, then
                   2888: .br
                   2889: A + B  counts N**2 flops,
                   2890: .br
                   2891: A*B    counts N**3 flops,
                   2892: .br
                   2893: A**100 counts 99*N**3 flops,
                   2894: .br
                   2895: LU(A)  counts roughly (1/3)*N**3 flops.
                   2896: .xx
                   2897: FOR```Repeat statements a specific number of times.
                   2898: .br
                   2899: FOR variable = expr, statement, ..., statement, END
                   2900: .br
                   2901: The END at the end of a line may be omitted.
                   2902: The comma before the END may also be omitted.
                   2903: The columns of the expression are stored one at a time in
                   2904: the variable and then the following statements, up to the
                   2905: END, are executed.  The expression is often of the form
                   2906: X:Y, in which case its columns are simply scalars.
                   2907: Some examples (assume N has already been assigned a value).
                   2908: .nf
                   2909: FOR I = 1:N, FOR J = 1:N, A(I,J) = 1/(I+J-1);
                   2910: FOR J = 2:N-1, A(J,J) = J; END; A
                   2911: FOR S = 1.0: -0.1: 0.0, ...  steps S with increments of -0.1 .
                   2912: FOR E = EYE(N), ...   sets  E  to the unit N-vectors.
                   2913: FOR V = A, ...   has the same effect as
                   2914: FOR J = 1:N, V = A(:,J); ...  except J is also set here.
                   2915: .fi
                   2916: .xx
                   2917: FUN```For matrix arguments  X , the functions SIN, COS, ATAN, SQRT,
                   2918: LOG, EXP and X**p are computed using eigenvalues  D  and
                   2919: eigenvectors  V .  If  <V,D> = EIG(X)  then  f(X) = V*f(D)/V .
                   2920: This method may give inaccurate results if  V  is badly
                   2921: conditioned.  Some idea of the accuracy can be obtained by
                   2922: comparing  X**1  with  X .
                   2923: .br
                   2924: For vector arguments, the function is applied to each component.
                   2925: .xx
                   2926: HESS``Hessenberg form.  The Hessenberg form of a matrix is zero
                   2927: below the first subdiagonal.  If the matrix is symmetric or
                   2928: Hermitian, the form is tridiagonal.  <P,H> = HESS(A) produces
                   2929: a unitary matrix P and a Hessenberg matrix H so that A = P*H*P'.
                   2930: By itself, HESS(A) returns H.
                   2931: .xx
                   2932: HILB``Inverse Hilbert matrix.  HILB(N)  is the inverse of the
                   2933: N by N  matrix with elements  1/(i+j-1), which is a famous
                   2934: example of a badly conditioned matrix.  The result is exact
                   2935: for  N  less than about 15, depending upon the computer.
                   2936: .xx
                   2937: IF````Conditionally execute statements.
                   2938: Simple form...
                   2939: .br
                   2940: IF expression rop expression, statements
                   2941: .br
                   2942: where rop is =, <, >, <=, >=, or <> (not equal) .
                   2943: The statements are executed once if the indicated comparison
                   2944: between the real parts of the first components of the two
                   2945: expressions is true, otherwise the statements are skipped.
                   2946: Example.
                   2947: .br
                   2948: IF ABS(I-J) = 1, A(I,J) = -1;
                   2949: .br
                   2950: More complicated forms use END in the same way it is used
                   2951: with FOR and WHILE and use ELSE as an abbreviation for
                   2952: END, IF expression not rop expression .  Example
                   2953: .nf
                   2954: FOR I = 1:N, FOR J = 1:N, ...
                   2955:    IF I = J, A(I,J) = 2; ELSE IF ABS(I-J) = 1, A(I,J) = -1; ...
                   2956:    ELSE A(I,J) = 0;
                   2957: An easier way to accomplish the same thing is
                   2958: A = 2*EYE(N);
                   2959: FOR I = 1:N-1, A(I,I+1) = -1; A(I+1,I) = -1;
                   2960: .fi
                   2961: .xx
                   2962: IMAG``IMAG(X)  is the imaginary part of  X .
                   2963: .xx
                   2964: INV```INV(X)  is the inverse of the square matrix  X .  A warning
                   2965: message is printed if  X  is badly scaled or nearly singular.
                   2966: .xx
                   2967: KRON``KRON(X,Y) is the Kronecker tensor product of X and Y .  
                   2968: It is also denoted by X`.*.`Y .  
                   2969: The result is a large matrix formed by taking all possible products 
                   2970: between the elements of X and those of Y .  
                   2971: For example, if X is 2 by 3, then X`.*.`Y is
                   2972: 
                   2973:       < x(1,1)*Y  x(1,2)*Y  x(1,3)*Y
                   2974:         x(2,1)*Y  x(2,2)*Y  x(2,3)*Y >
                   2975: 
                   2976: .br
                   2977: The five-point discrete Laplacian for an n-by-n grid can be 
                   2978: generated by
                   2979: 
                   2980:       T = diag(ones(n-1,1),1);  T = T + T';  I = EYE(T);
                   2981:       A = T.*.I + I.*.T - 4*EYE;
                   2982: 
                   2983: Just in case they might be useful, MATLAB includes
                   2984: constructions called Kronecker tensor quotients,
                   2985: denoted by X`./.`Y and X`.\\.`Y .
                   2986: They are obtained by replacing the elementwise multiplications
                   2987: in X`.*.`Y with divisions.
                   2988: .xx
                   2989: LINES`An internal count is kept of the number of lines of output
                   2990: since the last input.  Whenever this count approaches a limit,
                   2991: the user is asked whether or not to suppress printing until
                   2992: the next input.  Initially the limit is 25.  LINES(N) resets
                   2993: the limit to N .
                   2994: .xx
                   2995: LOAD``LOAD('file') retrieves all the variables from the file .
                   2996: See FILE and SAVE for more details.
                   2997: To prepare your own file for LOADing, change the READs to WRITEs
                   2998: in the code given under SAVE.
                   2999: .xx
                   3000: LOG```LOG(X)  is the natural logarithm of  X .  See FUN .
                   3001: Complex results are produced if  X  is not positive, or has
                   3002: nonpositive eigenvalues.
                   3003: .xx
                   3004: LONG``Determine output format.  All computations are done in
                   3005: complex arithmetic and double precision if it is available.
                   3006: SHORT and LONG merely switch between different output formats.
                   3007: .br
                   3008: SHORT````Scaled fixed point format with about 5 digits.
                   3009: .br
                   3010: LONG`````Scaled fixed point format with about 15 digits.
                   3011: .br
                   3012: SHORT`E``Floating point format with about 5 digits.
                   3013: .br
                   3014: LONG`E```Floating point format with about 15 digits.
                   3015: .br
                   3016: LONG`Z```System dependent format, often hexadecimal.
                   3017: .xx
                   3018: LU````Factors from Gaussian elimination.  <L,U> = LU(X)  stores a
                   3019: upper triangular matrix in  U  and a 'psychologically lower
                   3020: triangular matrix', i.e. a product of lower triangular
                   3021: and permutation matrices, in L , so that  X = L*U .
                   3022: By itself, LU(X) returns the output from CGEFA .
                   3023: .xx
                   3024: MACRO`The macro facility involves text and inward pointing angle brackets.  
                   3025: If STRING is the source text for any MATLAB expression or statement, then
                   3026: .br
                   3027:       t = 'STRING';
                   3028: .br 
                   3029: encodes the text as a vector of integers and stores that vector in `t`.
                   3030: DISP(t) will print the text and
                   3031: .br
                   3032:       >t<
                   3033: .br
                   3034: causes the text to be interpreted, either as a statement
                   3035: or as a factor in an expression.
                   3036: For example
                   3037: .br
                   3038:       t = '1/(i+j-1)';
                   3039:       disp(t)
                   3040:       for i = 1:n, for j = 1:n, a(i,j) = >t<;
                   3041: .br
                   3042: generates the Hilbert matrix of order n.
                   3043: .br
                   3044: Another example showing indexed text,
                   3045: .br
                   3046:       S = <'x = 3            '
                   3047:            'y = 4            '
                   3048:            'z = sqrt(x*x+y*y)'>
                   3049:       for k = 1:3, >S(k,:)<
                   3050: .br
                   3051: It is necessary that the strings making up the "rows" of the "matrix"
                   3052: `S` have the same lengths.
                   3053: .xx
                   3054: MAGIC`Magic square.  MAGIC(N) is an N by N matrix constructed
                   3055: from the integers 1 through N**2 with equal row and column sums.
                   3056: .xx
                   3057: NORM``For matrices..
                   3058: .nf
                   3059: NORM(X)  is the largest singular value of  X .
                   3060: NORM(X,1)  is the 1-norm of  X .
                   3061: NORM(X,2)  is the same as NORM(X) .
                   3062: NORM(X,'INF')  is the infinity norm of  X .
                   3063: NORM(X,'FRO')  is the F-norm, i.e.  SQRT(SUM(DIAG(X'*X))) .
                   3064: For vectors..
                   3065: NORM(V,P) = (SUM(V(I)**P))**(1/P) .
                   3066: NORM(V) = NORM(V,2) .
                   3067: NORM(V,'INF') = MAX(ABS(V(I))) .
                   3068: .fi
                   3069: .xx
                   3070: ONES``All ones.
                   3071: ONES(N)  is an N by N matrix of ones.
                   3072: ONES(M,N)  is an M by N matrix of ones .
                   3073: ONES(A)  is the same size as  A  and all ones .
                   3074: .xx
                   3075: ORTH``Orthogonalization.  Q = ORTH(X)  is a matrix with orthonormal
                   3076: columns, i.e. Q'*Q = EYE, which span the same space as the
                   3077: columns of  X .
                   3078: .xx
                   3079: PINV``Pseudoinverse.  X = PINV(A) produces a matrix  X  of
                   3080: the same dimensions as  A' so that  A*X*A = A ,
                   3081: X*A*X = X  and  AX  and  XA  are Hermitian .  The
                   3082: computation is based on SVD(A) and any singular values
                   3083: less than
                   3084: a tolerance are treated as zero.  The default tolerance is
                   3085: NORM(SIZE(A),'inf')*NORM(A)*EPS.
                   3086: This tolerance may be overridden with X = PINV(A,tol).
                   3087: See RANK.
                   3088: .xx
                   3089: PLOT``PLOT(X,Y) produces a plot of the elements of Y against those
                   3090: of X .  
                   3091: PLOT(Y) is the same as PLOT(1:n,Y) where n is the number of elements
                   3092: in Y .
                   3093: PLOT(X,Y,P) or PLOT(X,Y,p1,...,pk) passes the optional parameter vector P 
                   3094: or scalars p1 through pk to the plot routine.
                   3095: The default plot routine is a crude printer-plot. 
                   3096: It is hoped that an interface to local graphics equipment can be
                   3097: provided.
                   3098: .br
                   3099: An interesting example is
                   3100:       t = 0:50;
                   3101:       PLOT( t.*cos(t), t.*sin(t) )
                   3102: .xx
                   3103: POLY``Characteristic polynomial.
                   3104: .br
                   3105: If  A  is an N by N matrix, POLY(A) is a column vector with  N+1
                   3106: elements which are the coefficients of the characteristic
                   3107: polynomial,  DET(lambda*EYE - A) .
                   3108: .br
                   3109: If V is a vector, POLY(V) is a vector whose elements are the
                   3110: coefficients of the polynomial whose roots are the elements of V .
                   3111: For vectors, ROOTS and POLY are inverse functions of each other,
                   3112: up to ordering, scaling, and roundoff error.
                   3113: .br
                   3114: ROOTS(POLY(1:20)) generates Wilkinson's famous example.
                   3115: .xx
                   3116: PRINT`PRINT('file',X) prints X on the file using the current format
                   3117: determined by SHORT, LONG Z, etc.  See FILE.
                   3118: .xx
                   3119: PROD``PROD(X)  is the product of all the elements of  X .
                   3120: .xx
                   3121: QR````Orthogonal-triangular decomposition.
                   3122: .br
                   3123: <Q,R> = QR(X)  produces an upper triangular matrix  R
                   3124: of the same dimension as  X  and a unitary matrix  Q  so
                   3125: that  X = Q*R .
                   3126: .br
                   3127: <Q,R,E> = QR(X)  produces a permutation matrix  E , an
                   3128: upper triangular  R  with decreasing diagonal elements
                   3129: and a unitary  Q  so that  X*E = Q*R .
                   3130: .br
                   3131: By itself, QR(X) returns the output of CQRDC .
                   3132: TRIU(QR(X)) is R .
                   3133: .xx
                   3134: RAND``Random numbers and matrices.
                   3135: RAND(N)  is an N by N matrix with random entries.
                   3136: RAND(M,N)  is an M by N matrix with random entries.
                   3137: RAND(A)  is the same size as  A .
                   3138: RAND  with no arguments is a scalar whose value changes each
                   3139: time it is referenced.
                   3140: .br
                   3141: Ordinarily,  random numbers are uniformly distributed in
                   3142: the interval (0.0,1.0) .
                   3143: RAND('NORMAL')  switches to a normal distribution with mean 0.0 and
                   3144: variance 1.0 .
                   3145: RAND('UNIFORM')  switches back to the uniform distribution.
                   3146: .br
                   3147: RAND('SEED') returns the current value of the seed for the generator.
                   3148: RAND('SEED',n) sets the seed to n .
                   3149: RAND('SEED',0) resets the seed to 0, its value when MATLAB is first entered.
                   3150: .xx
                   3151: RANK``Rank.  K = RANK(X) is the number of singular values of  X
                   3152: that are larger than NORM(SIZE(X),'inf')*NORM(X)*EPS.
                   3153: .br
                   3154: K = RANK(X,tol) is the number of singular values of  X
                   3155: that are larger than tol .
                   3156: .xx
                   3157: RCOND`RCOND(X)  is an estimate for the reciprocal of the condition
                   3158: of  X  in the 1-norm obtained by the LINPACK condition estimator.
                   3159: If  X  is well conditioned,  RCOND(X) is near 1.0 .
                   3160: If  X  is badly conditioned, RCOND(X) is near 0.0 .
                   3161: .br
                   3162: <R, Z> = RCOND(A) sets  R  to RCOND(A) and also produces a vector  Z
                   3163: so that
                   3164:            NORM(A*Z,1) = R*NORM(A,1)*NORM(Z,1)
                   3165: .br
                   3166: So, if RCOND(A) is small, then  Z  is an approximate null vector.
                   3167: .xx
                   3168: RAT```An experimental function which attempts to remove the roundoff error
                   3169: from results that should be "simple" rational numbers.
                   3170: .br
                   3171: RAT(X) approximates each element of  X  
                   3172: by a continued fraction of the form
                   3173: .sp
                   3174:           a/b = d1 + 1/(d2 + 1/(d3 + ... + 1/dk))
                   3175: .sp
                   3176: with k`<=`len, integer di and abs(di)`<=`max .
                   3177: The default values of the parameters are
                   3178: len = 5 and max = 100.
                   3179: .br
                   3180: RAT(len,max) changes the default values.
                   3181: Increasing either len or max increases the number of possible fractions.
                   3182: .br
                   3183: <A,B> = RAT(X) produces integer matrices A and B so that
                   3184: .sp
                   3185:           A ./ B  =  RAT(X)
                   3186: .sp
                   3187: Some examples:
                   3188: .sp
                   3189:       long
                   3190:       T = hilb(6), X = inv(T)
                   3191:       <A,B> = rat(X)
                   3192:       H = A ./ B, S = inv(H)
                   3193:    
                   3194:       short e
                   3195:       d = 1:8,  e = ones(d),  A = abs(d'*e - e'*d)
                   3196:       X = inv(A)
                   3197:       rat(X)
                   3198:       display(ans)
                   3199: 
                   3200: .xx
                   3201: REAL``REAL(X)  is the real part of  X .
                   3202: .xx
                   3203: RETURN  From the terminal, causes return to the operating system or
                   3204: other program which invoked MATLAB.
                   3205: From inside an EXEC, causes return to the invoking EXEC, or to the
                   3206: terminal.
                   3207: .xx
                   3208: RREF``RREF(A) is the reduced row echelon form of the rectangular matrix.
                   3209: RREF(A,B) is the same as RREF(<A,B>) .
                   3210: .xx
                   3211: ROOTS`Find polynomial roots.
                   3212: ROOTS(C)  computes the roots of the polynomial whose coefficients
                   3213: are the elements of the vector  C .  If  C  has  N+1  components,
                   3214: the polynomial is  C(1)*X**N + ... + C(N)*X + C(N+1) .
                   3215: See POLY.
                   3216: .xx
                   3217: ROUND`ROUND(X) rounds the elements of  X  to the nearest integers.
                   3218: .xx
                   3219: SAVE``SAVE('file') stores all the current variables in a file.
                   3220: .br
                   3221: SAVE('file',X) saves only X .  See FILE .
                   3222: .br
                   3223: The variables may be retrieved later by LOAD('file') or by
                   3224: your own program using the following code for each matrix.
                   3225: The lines involving XIMAG may be eliminated if everything is known to
                   3226: be real.
                   3227: .sp
                   3228:       attach lunit to 'file'
                   3229:       REAL or DOUBLE PRECISION XREAL(MMAX,NMAX)
                   3230:       REAL or DOUBLE PRECISION XIMAG(MMAX,NMAX)
                   3231:       READ(lunit,101) ID,M,N,IMG
                   3232:       DO 10 J = 1, N
                   3233:          READ(lunit,102) (XREAL(I,J), I=1,M)
                   3234:          IF (IMG .NE. 0) READ(lunit,102) (XIMAG(I,J),I=1,M)
                   3235:    10 CONTINUE
                   3236: .sp
                   3237: The formats used are system dependent.  The following are typical.
                   3238: See SUBROUTINE SAVLOD in your local implementation of MATLAB.
                   3239: .sp
                   3240:   101 FORMAT(4A1,3I4)
                   3241:   102 FORMAT(4Z18)
                   3242:   102 FORMAT(4O20)
                   3243:   102 FORMAT(4D25.18)
                   3244: .xx
                   3245: SCHUR`Schur decomposition.  <U,T> = SCHUR(X)  produces an upper
                   3246: triangular matrix  T , with the eigenvalues of  X  on the
                   3247: diagonal, and a unitary matrix  U so that  X = U*T*U' and
                   3248: U'*U = EYE .  By itself, SCHUR(X) returns  T .
                   3249: .xx
                   3250: SHORT`See LONG .
                   3251: .xx
                   3252: SEMI``Semicolons at the end of lines will cause, rather than suppress,
                   3253: printing.  A second SEMI restores the initial interpretation.
                   3254: .xx
                   3255: SIN```SIN(X)  is the sine of  X .  See FUN .
                   3256: .xx
                   3257: SIZE``If X is an M by N matrix, then SIZE(X) is <M, N> .
                   3258: .br
                   3259: Can also be used with a multiple assignment, 
                   3260:       <M, N> = SIZE(X) .
                   3261: .xx
                   3262: SQRT``SQRT(X)  is the square root of  X .  See FUN .
                   3263: Complex results are produced if  X  is not positive, or has
                   3264: nonpositive eigenvalues.
                   3265: .xx
                   3266: STOP``Use EXIT instead.
                   3267: .xx
                   3268: SUM```SUM(X)  is the sum of all the elements of  X .
                   3269: SUM(DIAG(X))  is the trace of  X .
                   3270: .xx
                   3271: SVD```Singular value decomposition.  <U,S,V> = SVD(X)  produces
                   3272: a diagonal matrix  S , of the same dimension as  X  and with
                   3273: nonnegative diagonal elements in decreasing order, and
                   3274: unitary matrices  U  and  V  so that  X = U*S*V' .
                   3275: .br
                   3276: By itself, SVD(X) returns a vector containing the singular values.
                   3277: .br
                   3278: <U,S,V> = SVD(X,0) produces the "economy size" decomposition.
                   3279: If X is m by n with m > n, then only the first n columns of U are
                   3280: computed and S is n by n . 
                   3281: .xx
                   3282: TRIL``Lower triangle.  TRIL(X) is the lower triangular part of X.
                   3283: TRIL(X,K) is the elements on and below the K-th diagonal of X.
                   3284: K = 0 is the main diagonal, K > 0 is above the main diagonal
                   3285: and K < 0 is below the main diagonal.
                   3286: .xx
                   3287: TRIU``Upper triangle.  TRIU(X) is the upper triangular part of X.
                   3288: TRIU(X,K) is the elements on and above the K-th diagonal of X.
                   3289: K = 0 is the main diagonal, K > 0 is above the main diagonal
                   3290: and K < 0 is below the main diagonal.
                   3291: .xx
                   3292: USER``Allows personal Fortran subroutines to be linked into MATLAB .
                   3293: The subroutine should have the heading
                   3294: .sp
                   3295:          SUBROUTINE USER(A,M,N,S,T)
                   3296:          REAL or DOUBLE PRECISION A(M,N),S,T
                   3297: .sp
                   3298: The MATLAB statement  Y = USER(X,s,t)  results in a call to
                   3299: the subroutine with a copy of the matrix  X  stored in the
                   3300: argument  A , its column and row dimensions in  M  and  N ,
                   3301: and the scalar parameters  s  and  t  stored in  S  and  T .  
                   3302: If  s and t  are omitted, they are set to 0.0 .
                   3303: After the return,  A  is stored in  Y .
                   3304: The dimensions  M  and  N  may be reset within the subroutine.
                   3305: The statement  Y = USER(K)  results in a call with
                   3306: M = 1, N = 1  and  A(1,1) = FLOAT(K) .
                   3307: After the subroutine has been written, it must be compiled
                   3308: and linked to the MATLAB object code within the local operating
                   3309: system.
                   3310: .xx
                   3311: WHAT``Lists commands and functions currently available.
                   3312: .xx
                   3313: WHILE`Repeat statements an indefinite number of times.
                   3314: .br
                   3315: WHILE expr rop expr, statement, ..., statement, END
                   3316: .br
                   3317: where rop is =, <, >, <=, >=, or <> (not equal) .
                   3318: The END at the end of a line may be omitted.
                   3319: The comma before the END may also be omitted.
                   3320: The commas may be replaced by semicolons to avoid printing.
                   3321: The statements are repeatedly executed as long as the
                   3322: indicated comparison between the real parts of the first
                   3323: components of the two expressions is true.
                   3324: Example (assume a matrix  A  is already defined).
                   3325: .nf
                   3326: E = 0*A; F = E + EYE; N = 1;
                   3327: WHILE NORM(E+F-E,1) > 0, E = E + F; F = A*F/N; N = N + 1;
                   3328: E
                   3329: .fi
                   3330: .xx
                   3331: WHO```Lists current variables.
                   3332: .xx
                   3333: WHY```Provides succinct answers to any questions.
                   3334: .xx
                   3335: //

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.