Adjoint 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
if adjoint
then erase x
do iy = 1, ny {
do ix = 1, nx {
if operator itself
y(iy) = y(iy) + b(iy,ix) x(ix)
if adjoint
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.; } } } |
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) |
(2) |
The adjoint of a sum of terms is a collection of assignments. |
Adjoint operators |