我目前在Python中实现了一个Gadzow过滤器。在
放在上下文中。从一维数组开始(以范围(10)为例),然后用它构建一个类似Hankel的矩阵
H= [[0, 1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6],
[2, 3, 4, 5, 6, 7],
[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
然后用这个矩阵做一些线性代数,这不是问题。之后,最耗时的步骤是平均问题。在
在一个新的矩阵B中,你求出结果矩阵的元素的平均值。在第一行中,你用H中的精度给出的路径平均所有元素的平均值。所以类似于非对角线,但是从右上角到左下角。在第二个切片中,忽略第一行,依此类推。在
矩阵$H$在这个分析步骤下是不变的,但例如矩阵
^{pr2}$会变成
1 1.5 1.33 1
1 1 1 1
1 1 1 1
好吧,我希望你能理解这个问题。我的(工作但效率低下)代码是
def av_diag(A,i,j):
dim = A.shape
# get the "borders" of A
lim = min((dim[0]-i,j+1))
# calculate the mean
return np.mean([A[i+it,j-it] for it in range(lim)])
def avHankel(A):
# get the mean for all elements by nested list comprehension
return np.array([[av_diag(A,i,j) for j in range(len(A[0]))] for i in range(len(A))])
对于包含2048个数据点的数据,这需要一段时间,从而生成1024x1023矩阵。在
我会很高兴有可能的技巧来加速这个过程。在
谢谢
你可以用一个过滤器矩阵来卷积你的输入矩阵来加速你的代码。可以定义滤波器矩阵,以便在卷积的每个步骤中,仅提取给定坐标处的反对角线。基本上,你的过滤器矩阵只是一个反恒等矩阵。最后,由于卷积只对反对角线的元素求和,因此必须将输出除以正确的样本数,以获得平均值:
相关问题 更多 >
编程相关推荐