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

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

unix.superglobalmegacorp.com

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