## Matrix

### Definition

An instance of data type Matrix is a matrix of variables of number type NT. The types Matrix and Vector together realize many functions of basic linear algebra.

### Types

 Matrix::NT the ring type of the components. Matrix::iterator bidirectional iterator for accessing all components row-wise. Matrix::row_iterator random access iterator for accessing row entries. Matrix::column_iterator random access iterator for accessing column entries.

There also constant versions of the above iterators: const_iterator, row_const_iterator, and column_const_iterator.

 Matrix::Identity a tag class for identity initialization Matrix::Vector the vector type used.

### Creation

 Matrix M; creates an instance M of type Matrix. Matrix M ( int n); creates an instance M of type Matrix of dimension n × n initialized to the zero matrix. Matrix M ( int m, int n); creates an instance M of type Matrix of dimension m × n initialized to the zero matrix. Matrix M ( std::pair p); creates an instance M of type Matrix of dimension p.first × p.second initialized to the zero matrix. Matrix M ( int n, Identity, NT x = NT(1)); creates an instance M of type Matrix of dimension n × n initialized to the identity matrix (times x). Matrix M ( int m, int n, NT x); creates an instance M of type Matrix of dimension m × n initialized to the matrix with x entries. template Matrix M ( Forward_iterator first, Forward_iterator last); creates an instance M of type Matrix. Let S be the ordered set of n column-vectors of common dimension m as given by the iterator range [first,last). M is initialized to an m × n matrix with the columns as specified by S. Precondition: Forward_iterator has a value type V from which we require to provide a iterator type V::const_iterator, to have V::value_type == NT. Note that Vector or std::vector fulfill these requirements. Matrix M ( std::vector< Vector > A); creates an instance M of type Matrix. Let A be an array of n column-vectors of common dimension m. M is initialized to an m × n matrix with the columns as specified by A.

### Operations

 int M.row_dimension () returns n, the number of rows of M. int M.column_dimension () returns m, the number of columns of M. std::pair M.dimension () returns (m,n), the dimension pair of M. Vector M.row ( int i) returns the i-th row of M (an m - vector). Precondition: 0 i m - 1. Vector M.column ( int i) returns the i-th column of M (an n - vector). Precondition: 0 i n - 1. NT& M ( int i, int j) returns Mi,j. Precondition: 0 i m-1 and 0 j n-1. void M.swap_rows ( int i, int j) swaps rows i and j. Precondition: 0 i m-1 and 0 j m-1. void M.swap_columns ( int i, int j) swaps columns i and j. Precondition: 0 i n-1 and 0 j n-1. row_iterator M.row_begin ( int i) an iterator pointing to the first entry of the ith row. Precondition: 0 i m-1. row_iterator M.row_end ( int i) an iterator pointing beyond the last entry of the ith row. Precondition: 0 i m-1. column_iterator M.column_begin ( int i) an iterator pointing to the first entry of the ith column. Precondition: 0 i n-1. column_iterator M.column_end ( int i) an iterator pointing beyond the last entry of the ith column. Precondition: 0 i n-1. iterator M.begin () an iterator pointing to the first entry of M. terator M.end () an iterator pointing beyond the last entry of M.

The same operations exist for row_const_iterator, column_const_iterator and const_iterator.

 bool M == M1 Test for equality. bool M != M1 Test for inequality.

### Arithmetic Operators

 Matrix M + M1 Addition. Precondition: M.row_dimension() == M1.row_dimension() and M.column_dimension() == M1.column_dimension(). Matrix M - M1 Subtraction. Precondition: M.row_dimension() == M1.row_dimension() and M.column_dimension() == M1.column_dimension(). Matrix - M Negation. Matrix M * M1 Multiplication. Precondition: M.column_dimension() = M1.row_dimension(). Vector M * Vector vec Multiplication with vector. Precondition: M.column_dimension() = vec.dimension(). Matrix NT x * M Multiplication of every entry with x. Matrix M * NT x Multiplication of every entry with x.