# 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 **1**s 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[3]** or **var MyMatrix[3][3]**.

### 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);
}

### See also:

series
► latest
version online