【发布时间】:2023-03-06 14:25:02
【问题描述】:
我正在尝试插入一些数据以进行绘图。例如,给定 N 个数据点,我希望能够生成一个“平滑”图,由 10*N 左右的插值数据点组成。
我的方法是生成一个 N×10*N 矩阵并计算原始向量和我生成的矩阵的内积,得到一个 1×10*N 向量。我已经计算出我想用于插值的数学,但我的代码很慢。我对 Python 很陌生,所以我希望这里的一些专家可以给我一些想法,让我可以尝试加快我的代码速度。
我认为部分问题在于生成矩阵需要对以下函数进行 10*N^2 次调用:
def sinc(x):
import math
try:
return math.sin(math.pi * x) / (math.pi * x)
except ZeroDivisionError:
return 1.0
(这个comes from sampling theory。本质上,我正在尝试从其样本中重新创建一个信号,并将其上采样到更高的频率。)
矩阵由以下生成:
def resampleMatrix(Tso, Tsf, o, f):
from numpy import array as npar
retval = []
for i in range(f):
retval.append([sinc((Tsf*i - Tso*j)/Tso) for j in range(o)])
return npar(retval)
我正在考虑将任务分解成更小的部分,因为我不喜欢将 N^2 矩阵放在内存中的想法。我可能可以将“resampleMatrix”变成一个生成器函数并逐行执行内积,但我认为这不会大大加快我的代码速度,直到我开始将内容分页进出内存。
提前感谢您的建议!
【问题讨论】:
-
除了您尝试对代码执行的操作之外,您可以在没有数据生成模型的情况下仅插入额外点的想法是错误的。如果您想以任何统计原则的方式执行此操作,则需要执行某种回归。见en.wikipedia.org/wiki/Generative_model
-
看起来 Phil 只想使用插值进行绘图。只要插值点不用于其他目的,我不明白为什么需要生成模型
-
@Phil:考虑到它是 O(N^2) 算法,而其他方法(如三次样条)只有 O(N),您想使用 sinc 插值的任何特殊原因?
-
@twole18:数据的模型是按照en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem采样的。您可以使用 sinc 函数完全恢复原始数据。
-
numpy 已经有一个
sinc()函数,顺便说一下。 docs.scipy.org/doc/numpy/reference/generated/numpy.sinc.html
标签: python matrix interpolation signal-processing generator