Annotation of researchv10dc/cmd/matlab/doc, revision 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.