1

我正在尝试将 Matlab 代码转换为 Python。为了做一个多信号一维小波分解,我mdwtdec()在 Matlab 中使用。我在 python 中找到的最接近的函数在pywtlib, wavedec().

而 matlab 函数有 4 个参数mdwtdec(DIRDEC,X,LEV,WNAME):这X是信号,LEV是电平,WNAME是小波名称,DIRDEC是方向指示器:(r行)或c(列)。

mdwtdec(DIRDEC,X,LEV,WNAME)返回矩阵LEV的每一行 (if DIRDEC = r) 或每一列 (if )级别的小波分解,使用小波DIRDEC = cXWNAME.

在 pywavelets 中,takeswavedec(X,LEV,WNAME)和Matlab类似。方向没有选项,因此默认设置为“r”。我也需要 'c' 作为选项,如何在 Python 中实现它?XLEVWNAME

4

1 回答 1

1

pywt'swavedec假设信号是一个数组。如果信号不是一个数组,那么结果就不那么令人信服了(对于方阵,结果似乎对应于逐行操作,但对于非方阵则不能这样说)。

幸运的是,您可以使用'swavedec为每一行或每一列运行。通过一些额外的包装,您可以定义一个 Matlab 近似值(Matlab 的版本可能具有更好的错误处理),例如:numpyapply_along_axismdwtdec

import pywt
import numpy as np
def mdwtdec(dirdec,x,lev,wavelet):
    """
    Multisignal 1D Discrete Wavelet decomposition.

    Parameters
    ----------
    dirdec  : char
        Direction indicator: 'r' (row) or 'c' (column)
    x       : matrix
        Input matrix
    wavelet : Wavelet object or name string
        Wavelet to use
    lev     : int
        Decomposition level (must be >= 0). If level is None then it
        will be calculated using the ``dwt_max_level`` function.
    """
    return np.apply_along_axis(
        lambda y: np.concatenate(pywt.wavedec(y, wavelet, level=lev)),
        axis={'c':0, 'r':1}[dirdec], arr=x)

我在其中使用过:

  • np.concatenate将近似系数和细节系数保持为紧密的行/列向量
  • 一个lambda表达式,用于指定执行的函数以及输入参数的映射
于 2016-02-04T02:50:06.277 回答