# Vector and matrix functions

The following functions can be used for matrix and vector algebra.

## matrix(int rows, int cols): mat

Creates a vector or a matrix with the given number of rows and columns. The matrix is initialized to zeros. If cols is omitted, an identity matrix with 1s in the diagonal is created.

### Parameters:

rows - number of rows of the matrix, or 1 for defining a row vector.
cols - number of columns, or 1 for defining a column vector. Omit this for a square identity matrix.

## me(mat X, int row, int col): var

Macro for accessing an element of the matrix X at a given row and column, with no range check.

## ve(mat V, int n): var

Macro for accessing the n-th element of the row or column vector V, with no range check.

### Parameters:

X, V - matrix to be accessed.
row - row number of the element, starting with 0.
col - column number of the element, starting with 0.

## matSet(mat X, mat A): mat

Copies matrix A to matrix X, and returns X. A and X must have the same number of rows and columns.

### Parameters:

X - destination matrix or vector
A - source matrix or vector

## matSet(mat X, int row, int col, mat A): mat

Copies matrix A to a sub-range of matrix X that starts at the given row and colunm, and returns X. A and X can have different numbers of rows and columns.

### Parameters:

X - destination matrix
A - source matrix
row - row number of the block, starting with 0.
col - column number of the block.

## matSet(mat X, var c): mat

Sets all elements of matrix X to the value c, and returns X.

### Parameters:

X - destination matrix.
c - value to be set.

## matTrans(mat X, mat A): mat

Copies the transpose of A to X, and returns X. The number of columns of X must be identical to the number of rows of A, and vice versa.

### Parameters:

X - destination matrix.
A - source matrix.

## matAdd(mat X, mat A, mat B): mat

Adds A and B, stores the result in X, and returns X. A, B, and X must have the same number of rows and columns.

### Parameters:

X - destination matrix.
A,B - source matrices.

## matSub(mat X, mat A, mat B): mat

Subtracts B from A, stores the result in X, and returns X. A, B, and X must have the same number of rows and columns.

### Parameters:

X - destination matrix.
A,B - source matrices.

## matMul(mat X, mat A, mat B): mat

Multiplies A with B, stores the result in X, and returns X. X and A must have the same number of rows, X and B must have the same number of columns, and the B number of rows must be identical to the A number of columns.

### Parameters:

X - destination matrix.
A,B - source matrices.

## matScale(mat X, var c): mat

Multiplies all elements of X with c, and returns X.

### Parameters:

X - destination matrix.
c - multiplication factor.

### Remarks:

• Matrices are created in the INITRUN and released after the EXITRUN. Just like series, matrix() creation must happen in a fixed order in the script, preferably at the begin of the run or main function.
• The mat type is a pointer of the MATRIX struct defined in trading.h. The numbers of rows and columns are stored in the ->rows and ->cols elements, a pointer to the content is stored in the ->dat element.
• Vectors can be defined as matrices with rows = 1 or cols = 1. The dot product is the multiplication of a row vector with a column vector.
• If matrix arithmetics is not required and the row/column number is fixed, matrices and vectors can be alternatively defined as var arrays, like var MyVector or var MyMatrix.

### Example:

```void matPrintf(mat X)
{
int i,j;
printf("\n");
for(i=0; i < X->rows; i++) {
for(j=0; j < X->cols; j++)
printf("%.0f ",me(X,i,j));
printf("\n");
}
}

void main()
{
int i,j;
mat A = matrix(3,4);
for(i=0; i < A->rows; i++)
for(j=0; j < A->cols; j++)
me(A,i,j) = i+j;
matPrintf(A);

mat B = matTrans(matrix(A->cols,A->rows),A);
matPrintf(B);

mat C = matrix(B->rows,A->cols);
matMul(C,B,A);
matPrintf(C);

mat D = matrix(8);
matSet(D,4,4,C);
matPrintf(D);
}
```