SYNOPSIS

```#include "matrix.h"
MAT     *m_add(MAT *A, MAT *B, MAT *C)
MAT     *m_mlt(MAT *A, MAT *B, MAT *C)
MAT     *m_sub(MAT *A, MAT *B, MAT *C)
MAT     *sm_mlt(double s, MAT *A, MAT *OUT)
```
```#include "zmatrix.h"
ZMAT    *zm_add(ZMAT *A, ZMAT *B, ZMAT *C)
ZMAT    *zm_mlt(ZMAT *A, ZMAT *B, ZMAT *C)
ZMAT    *zm_sub(ZMAT *A, ZMAT *B, ZMAT *C)
ZMAT    *zsm_mlt(complex s, ZMAT *A, ZMAT *OUT)
```

DESCRIPTION

The functions m_add(), zm_add() adds the matrices A and B and puts the result in C. If C is NULL, or is too small to contain the sum of A and B, then the matrix is resized to the correct size, which is then returned. Otherwise the matrix C is returned. The functions, m_sub(), zm_sub() subtracts the matrix B from A and puts the result in C. If C is NULL, or is too small to contain the sum of A and B, then the matrix is resized to the correct size, which is then returned. Otherwise the matrix C is returned. Similarly, m_mlt() multiplies the matrices A and B and puts the result in C. Again, if C is NULL or too small, then a matrix of the correct size is created which is returned. The routines sm_mlt(), zsm_mlt() above puts the results of multiplying the matrix A by the scalar s in the matrix OUT. If, on entry, OUT is NULL, or is too small to contain the results of this operation, then OUT is resized to have the correct size. The result of the operation is returned. This operation may be performed in situ. That is, you may use A == OUT. The routines m_add(), m_sub() and sm_mlt() routines and their complex counterparts can work in situ\/; that is, C need not be different to either A or B. However, m_mlt() and zm_mlt() will raise an E_INSITU error if A == C or B == C. These routines avoid thrashing on virtual memory machines.

EXAMPLE

```MAT    *A, *B, *C;
Real   alpha;
......
C = m_add(A,B,MNULL);  /* C = A+B */
m_sub(A,B,C);          /* C = A-B */
sm_mlt(alpha,A,C);     /* C = alpha.A */
m_mlt(A,B,C);          /* C = A.B */
```