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)

结果将是: