Matrix multiplication and transpose multiplication still fit easily in the same computational framework when the matrix has a special form, such as
![]() |
(4) |
Equation (4) could be rewritten as
![]() |
(5) |
![]() |
(6) |
The adjoint of (5) crosscorrelates a fixed portion of filter input across a variable portion of filter output.
![]() |
(7) |
Module tcai1
is used for
and module tcaf1
is used for
.
module tcai1 { # Transient Convolution Adjoint Input 1-D. yy(m1+n1)
real, dimension (:), pointer :: bb
integer :: nx
#% _init( bb, nx)
#% _lop ( xx, yy)
integer b, x, y
if( size(yy) < nx + size(bb) - 1 ) call erexit('tcai')
do b= 1, size(bb) {
do x= 1, nx { y = x + b - 1
if( adj)
xx(x) = xx(x) + yy(y) * bb(b)
else
yy(y) = yy(y) + xx(x) * bb(b)
}}
}
module tcaf1 { # Transient Convolution, Adjoint is the Filter, 1-D
real, dimension (:), pointer :: xx
#% _init( xx)
#% _lop ( bb, yy)
integer x, b, y
if( size(yy) < size(xx) + size(bb) - 1 ) call erexit('tcaf')
do b= 1, size(bb) {
do x= 1, size(xx) { y = x + b - 1
if( adj)
bb(b) = bb(b) + yy(y) * xx(x)
else
yy(y) = yy(y) + bb(b) * xx(x)
} }
}