interp2(V,k) 从 Matlab 到 Python
interp2(V,k) from Matlab to Python
我正在尝试将此版本的 interp2 从 Matlab 转换为 Python。
在 Matlab 中用作
Vq = interp2(V,k)
它对矩阵 V
执行插值,其中每个原始间隔已被递归细分 k
次。向每个分区添加总共 2^k-1
个元素。
但是我还没有找到 Python 替代此功能的方法。我试过 scipy.interpolation.interp2
但只适用于三个矩阵。
我在 Forum 中找到了这个替代方案,看起来像是电子邮件抄录,但无论如何我都会在这里粘贴答案。
import numpy as np
def interp2d_interleave(z,n):
'''performs linear interpolation on a grid
all points are interpolated in one step not recursively
Parameters
----------
z : 2d array (M,N)
n : int
number of points interpolated
Returns
-------
zi : 2d array ((M-1)*n+M, (N-1)*n+N)
original and linear interpolated values
'''
frac = np.atleast_2d(np.arange(0,n+1)/(1.0+n)).T
zi1 = np.kron(z[:,:-1],np.ones(len(frac))) + np.kron(np.diff(z),frac.T)
zi1 = np.hstack((zi1,z[:,-1:]))
zi2 = np.kron(zi1.T[:,:-1],np.ones(len(frac))) + np.kron(np.diff(zi1.T),frac.T)
zi2 = np.hstack((zi2,zi1.T[:,-1:]))
return zi2.T
def interp2d_interleave_recursive(z,n):
'''interpolates by recursively interleaving n times
'''
zi = z.copy()
for ii in range(1,n+1):
zi = interp2d_interleave(zi,1)
return zi
这个应该按如下方式使用
xyz = np.zeros((2, 2))
xyz = interp2d_interleave_recursive(xyz, 1)
结果将是:
我正在尝试将此版本的 interp2 从 Matlab 转换为 Python。 在 Matlab 中用作
Vq = interp2(V,k)
它对矩阵 V
执行插值,其中每个原始间隔已被递归细分 k
次。向每个分区添加总共 2^k-1
个元素。
但是我还没有找到 Python 替代此功能的方法。我试过 scipy.interpolation.interp2
但只适用于三个矩阵。
我在 Forum 中找到了这个替代方案,看起来像是电子邮件抄录,但无论如何我都会在这里粘贴答案。
import numpy as np
def interp2d_interleave(z,n):
'''performs linear interpolation on a grid
all points are interpolated in one step not recursively
Parameters
----------
z : 2d array (M,N)
n : int
number of points interpolated
Returns
-------
zi : 2d array ((M-1)*n+M, (N-1)*n+N)
original and linear interpolated values
'''
frac = np.atleast_2d(np.arange(0,n+1)/(1.0+n)).T
zi1 = np.kron(z[:,:-1],np.ones(len(frac))) + np.kron(np.diff(z),frac.T)
zi1 = np.hstack((zi1,z[:,-1:]))
zi2 = np.kron(zi1.T[:,:-1],np.ones(len(frac))) + np.kron(np.diff(zi1.T),frac.T)
zi2 = np.hstack((zi2,zi1.T[:,-1:]))
return zi2.T
def interp2d_interleave_recursive(z,n):
'''interpolates by recursively interleaving n times
'''
zi = z.copy()
for ii in range(1,n+1):
zi = interp2d_interleave(zi,1)
return zi
这个应该按如下方式使用
xyz = np.zeros((2, 2))
xyz = interp2d_interleave_recursive(xyz, 1)
结果将是: