16.4.4 The CALL Command
A matrix function returns a single result. The CALL command implements procedures, which take a similar syntactic form to functions but yield results by modifying their arguments rather than returning a value.
Output arguments to a CALL procedure must be a single variable name.
The following procedures are implemented via CALL to allow them to return multiple results. For these procedures, the output arguments need not name existing variables; if they do, then their previous values are replaced:
CALL EIGEN(M, evec, eval)
Computes the eigenvalues and eigenvector of symmetric n ×n matrix M. Assigns the eigenvectors of M to the columns of n ×n matrix evec and the eigenvalues in descending order to n-element column vector eval.
Use the EVAL function (see EVAL) to compute just the eigenvalues of a symmetric matrix.
For example, the following matrix language commands:
CALL EIGEN({1, 0; 0, 1}, evec, eval).
PRINT evec.
PRINT eval.
CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
PRINT evec2.
PRINT eval2.
yield this output:
evec
1 0
0 1
eval
1
1
evec2
-.6666666667 .0000000000 .7453559925
-.3333333333 -.8944271910 -.2981423970
-.6666666667 .4472135955 -.5962847940
eval2
8.0000000000
-1.0000000000
-1.0000000000
CALL SVD(M, U, S, V)
Computes the singular value decomposition of n ×k matrix M, assigning S a n ×k diagonal matrix and to U and V unitary k ×k matrices such that M = U×S×V^T. The main diagonal of Q contains the singular values of M.
Use the SVAL function (see SVAL) to compute just the singular values of a matrix.
For example, the following matrix program:
CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
PRINT (u * s * T(v))/FORMAT F5.1.
yields this output:
(u * s * T(v))
3.0 2.0 2.0
2.0 3.0 -2.0
The final procedure is implemented via CALL to allow it to modify a matrix instead of returning a modified version. For this procedure, the output argument must name an existing variable.
CALL SETDIAG(M, V)
Replaces the main diagonal of n ×p matrix M by the contents of k-element vector V. If k = 1, so that V is a scalar, replaces all of the diagonal elements of M by V. If k < \min(n,p), only the upper k diagonal elements are replaced; if k > \min(n,p), then the extra elements of V are ignored.
Use the MDIAG function (see MDIAG) to construct a new matrix with a specified main diagonal.
For example, this matrix program:
COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
CALL SETDIAG(x, 10).
PRINT x.
outputs the following:
x
10 2 3
4 10 6
7 8 10