def derampGMatrix(displ):
""" Deramp through lsq a bilinear plane
Data is also de-meaned
"""
if displ.ndim != 2:
raise TypeError('Displacement has to be 2-dim array')
# form a relative coordinate grid
c_grid = num.mgrid[0:displ.shape[0], 0:displ.shape[1]]
# separate and flatten coordinate grid into x and y vectors for each !point
ix = c_grid[0].flat
iy = c_grid[1].flat
displ_f = displ.flat
# reduce vectors taking out all NaN's
displ_nonan = displ_f[num.isfinite(displ_f)]
ix = ix[num.isfinite(displ_f)]
iy = iy[num.isfinite(displ_f)]
# form kernel/design derampMatrix (c, x, y)
GT = num.matrix([num.ones(len(ix)), ix, iy])
G = GT.T
# generalized kernel matrix (quadtratic)
GTG = GT * G
# generalized inverse
GTGinv = GTG.I
# lsq estimates of ramp parameter
ramp_paras = displ_nonan * (GTGinv * GT).T
# ramp values
ramp_nonan = ramp_paras * GT
ramp_f = num.multiply(displ_f, 0.)
# insert ramp values in full vectors
num.place(ramp_f, num.isfinite(displ_f), num.array(ramp_nonan).flatten())
ramp_f = ramp_f.reshape(displ.shape[0], displ.shape[1])
return displ - ramp_f
评论列表
文章目录