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

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

unix.superglobalmegacorp.com

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