# IntroductionΒΆ

When working towards a solution of a linear system \(Ax=b\), Krylov methods
do not need to know anything structural about the matrix \(A\); all they
require is the ability to form matrix-vector products \(v \mapsto Av\) and,
possibly, products with the transpose \(u \mapsto A^T u\). In essence, we
do not even need the *operator* \(A\) to be represented by a matrix at all;
we simply consider it as a linear function.

In PyKrylov, such linear functions can be conveniently packaged as
`LinearOperator` objects. If `A` is an instance of `LinearOperator` and
represents the “matrix” \(A\) above, we may computes matrix-vector products
by simply writing `A*v`, where `v` is a Numpy array of appropriate size.

Similarly, if a Krylov method requires access to the transpose operator
\(A^T\), it is conveniently available as `A.T` and products may be
computed using, e.g., `A.T * u`. If `A` represents a symmetric operator
\(A = A^T\), then `A.T` is simply a reference to `A` itself.

More generally, since \((A^T)^T = A\), the Python statement `A.T.T is A`
always evaluates to `True`, which means that they are the *same* object.

In the next two sections, we describe generic linear operators and linear operators constructed by blocks.