我正在尝试将Matlab代码转换为Python。为了实现多信号一维小波分解,在Matlab中使用了mdwtdec() .我在python中找到的最接近的函数是pywt lib,wavedec()。
而matlab函数采用4个参数mdwtdec(DIRDEC,X,LEV,WNAME):这里X是信号,LEV是电平,WNAME是小波名,DIRDEC是方向指示符:r (行)或c (列)。
mdwtdec(DIRDEC,X,LEV,WNAME)在矩阵X的每一行(如果DIRDEC = r)或每列(如果DIRDEC = c)的水平上返回小波分解,使用小波WNAME.。
在小波变换中,wavedec(X,LEV,WNAME)采用与Matlab相似的X、LEV和WNAME。该方向没有选项,因此默认情况下它被设置为'r‘。我也需要“c”作为选项,如何在Python中实现它?
发布于 2016-02-04 02:50:06
pywt的wavedec假设信号是一个数组,如果信号不是数组,那么结果就不那么令人信服了(对于方阵,结果似乎与逐行运算相对应,而对于非方阵则不是这样)。
幸运的是,您可以使用wavedec对每一行或每列运行apply_along_axis。使用一些额外的包装,您可以定义一个Matlab近似(Matlab的版本可能有更好的错误处理)到mdwtdec,例如:
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.concatenatelambda表达式,用于指定执行的函数以及输入参数的映射https://stackoverflow.com/questions/35140645
复制相似问题