# Vectors and matrices¶

NGSolve contains two different implementations of linear algebra: One deals with *dense* matrices which are typically small, the other one with typically large *sparse* matrices and linear operators as needed in the finite element method.

## Large Linear Algebra¶

Grid-functions, bilinear-forms and linear-forms create vectors and matrices. You can query them using the u.vec or bfa.mat attributes. You can print them via print (u.vec), or set values gf.vec[0:10] = 3.7.

You can create new vectors of the same size and the same element type via

```
vu = u.vec
help = vu.CreateVector()
```

You can perform vector-space operations

```
help.data = 3 * vu
help.data += mat * vu
print ("(u,h) = ", InnerProduct(help, vu))
```

There are a few things to take care of:

Use the .data attribute to write to an existing vector. The expression help = 3 * vu will redefine the object help to something like the symbolic expression

*product of scalar times vector*.You can combine certain operations (e.g. help.data = 3 * u1 + 4 * u2 + mat * u4), but not arbitrary operations (as help.data = mat * (u1+u2) or help.data = mat1 * mat2 * u). The ratio behind is that the operations must be computable without allocating temporary vectors.

You can also work with NGSolve-Data from numpy/scipy, see also here [ngspy-numpy](ngspy-numpy) ## Small Linear Algebra

With x = Vector(5) and m = Matrix(3,5) you create a vector and a matrix. You can access elements with brackets, and perform linear algebra operations. y = m * x defines a new vector y.

ngsolve provides elementary matrix-vector operations. For other operations, we recommend to use the numpy package. With m.NumPy() you get a multi-dimensional numpy array sharing the memory of the matrix m.