# FAMILIAR OPERATORS

The operation is the multiplication of a matrix by a vector . The adjoint operation is . The operation adjoint to multiplication by a matrix is multiplication by the transposed matrix (unless the matrix has complex elements, in which case we need the complex-conjugated transpose). The following pseudocode does matrix multiplication and multiplication by the transpose :


if operator itself

then erase y

then erase x

do iy = 1, ny {

do ix = 1, nx {

if operator itself

y(iy) = y(iy) + b(iy,ix)  x(ix)

x(ix) = x(ix) + b(iy,ix)  y(iy)
}}


Notice that the bottom line'' in the program is that and are simply interchanged. The above example is a prototype of many to follow, so observe carefully the similarities and differences between the operation and its adjoint.

A formal subroutine for matrix multiply and its adjoint is found below. The first step is a subroutine, adjnull(), for optionally erasing the output. With the option add=true, results accumulate like y=y+B*x.

 void sf_adjnull (bool adj /* adjoint flag */, bool add /* addition flag */, int nx /* size of x */, int ny /* size of y */, float* x, float* y) /*< Zeros out the output (unless add is true). Useful first step for any linear operator. >*/ { int i; if(add) return; if(adj) { for (i = 0; i < nx; i++) { x[i] = 0.; } } else { for (i = 0; i < ny; i++) { y[i] = 0.; } } } 
The subroutine matmult() for matrix multiply and its adjoint exhibits the style that we will use repeatedly.
user/fomels/matmult.c
 void matmult_lop (bool adj, bool add, int nx, int ny, float* x, float*y) /*< linear operator >*/ { int ix, iy; sf_adjnull (adj, add, nx, ny, x, y); for (ix = 0; ix < nx; ix++) { for (iy = 0; iy < ny; iy++) { if (adj) x[ix] += B[iy][ix] * y[iy]; else y[iy] += B[iy][ix] * x[ix]; } } } 

Sometimes a matrix operator reduces to a simple row or a column.

A row      is a summation operation.

A column is an impulse response.

If the inner loop of a matrix multiply ranges within a

row,      the operator is called sum or pull.

column, the operator is called spray or push.

A basic aspect of adjointness is that the adjoint of a row matrix operator is a column matrix operator. For example, the row operator

 (1)

has an adjoint that is two assignments:
 (2)

 The adjoint of a sum of terms is a collection of assignments.

Subsections