### 16.4 MATRIX ¶

    MATRIX.
    ...matrix commands...
    END MATRIX.

The following basic matrix commands are supported:

    COMPUTE variable[(index[,index])]=expression.
    CALL procedure(argument, ...).
    PRINT [expression]
          [/FORMAT=format]
          [/TITLE=title]
          [/SPACE={NEWPAGE | n}]
          [{/RLABELS=string... | /RNAMES=expression}]
          [{/CLABELS=string... | /CNAMES=expression}].

The following matrix commands offer support for flow control:

    DO IF expression.
      ...matrix commands...
    [ELSE IF expression.
      ...matrix commands...]...
    [ELSE
      ...matrix commands...]
    END IF.

    LOOP [var=first TO last [BY step]] [IF expression].
      ...matrix commands...
    END LOOP [IF expression].

    BREAK.

The following matrix commands support matrix input and output:

    READ variable[(index[,index])]
         [/FILE=file]
         /FIELD=first TO last [BY width]
         [/FORMAT=format]
         [/SIZE=expression]
         [/MODE={RECTANGULAR | SYMMETRIC}]
         [/REREAD].
    WRITE expression
          [/OUTFILE=file]
          /FIELD=first TO last [BY width]
          [/MODE={RECTANGULAR | TRIANGULAR}]
          [/HOLD]
          [/FORMAT=format].
    GET variable[(index[,index])]
        [/FILE={file | *}]
        [/VARIABLES=variable...]
        [/NAMES=expression]
        [/MISSING={ACCEPT | OMIT | number}]
        [/SYSMIS={OMIT | number}].
    SAVE expression
         [/OUTFILE={file | *}]
         [/VARIABLES=variable...]
         [/NAMES=expression]
         [/STRINGS=variable...].
    MGET [/FILE=file]
         [/TYPE={COV | CORR | MEAN | STDDEV | N | COUNT}].
    MSAVE expression
          /TYPE={COV | CORR | MEAN | STDDEV | N | COUNT}
          [/OUTFILE=file]
          [/VARIABLES=variable...]
          [/SNAMES=variable...]
          [/SPLIT=expression]
          [/FNAMES=variable...]
          [/FACTOR=expression].

The following matrix commands provide additional support:

    DISPLAY [{DICTIONARY | STATUS}].
    RELEASE variable....

`MATRIX` and `END MATRIX` enclose a special PSPP sub-language, called the matrix language. The matrix language does not require an active dataset to be defined and only a few of the matrix language commands work with any datasets that are defined. Each instance of `MATRIX`…`END MATRIX` is a separate program whose state is independent of any instance, so that variables declared within a matrix program are forgotten at its end.

The matrix language works with matrices, where a matrix is a rectangular array of real numbers. An n×m matrix has n rows and m columns. Some special cases are important: a n×1 matrix is a column vector, a 1×n is a row vector, and a 1×1 matrix is a scalar.

The matrix language also has limited support for matrices that contain 8-byte strings instead of numbers. Strings longer than 8 bytes are truncated, and shorter strings are padded with spaces. String matrices are mainly useful for labeling rows and columns when printing numerical matrices with the `MATRIX PRINT` command. Arithmetic operations on string matrices will not produce useful results. The user should not mix strings and numbers within a matrix.

The matrix language does not work with cases. A variable in the matrix language represents a single matrix.

The matrix language does not support missing values.

`MATRIX` is a procedure, so it cannot be enclosed inside `DO IF`, `LOOP`, etc.

Macros may be used within a matrix program, and macros may expand to include entire matrix programs. The `DEFINE` command may not appear within a matrix program. See DEFINE, for more information about macros.

The following sections describe the details of the matrix language: first, the syntax of matrix expressions, then each of the supported commands. The `COMMENT` command (see COMMENT) is also supported.