【问题标题】:Optimizing Fourier Series Fitting Function Matlab优化傅里叶级数拟合函数 Matlab
【发布时间】:2016-01-26 12:50:12
【问题描述】:

我正在尝试遍历一组似乎显示周期性变化的样本。我需要不断地应用拟合函数来获得傅立叶级数系数​​,回归必须是过去的 n 个样本(在我的例子中,大约是 30)。问题是,我的代码非常慢!对一组 50,000 个样本执行此操作大约需要 1 小时。有没有办法优化这个?我究竟做错了什么?

这是我的代码:

function[coefnames,coef] = fourier_regression(vect_waves,n)        

    j = 1;
    coef = zeros(length(vect_waves)-n,10);

    for i=n+1:length(vect_waves)

        take_fourier = vect_waves(i-n+1:i);
        x = 1:n;
        f = fit(x,take_fourier,'fourier4');
        current_coef = coeffvalues(f);
        coef(j,1:length(current_coef)) = current_coef;
        j = j + 1;



    end
    coefnames = coeffnames(f);

end

当我打电话给[coefnames,coef] = fourier_regression(VECTOR,30); 时,这需要很长时间才能计算出来。有什么办法可以解决吗?我的代码有什么问题?

注意:我有一个 intel i7 5500 U cpu,16GB RAM,并使用 Matlab 2015a。

【问题讨论】:

  • coeffnames 来自哪里?在倒数第二行调用它之前,您没有定义它。我建议您还说明vect_waves 中包含的内容,即什么样的数字,并可能发布前 10 行左右,以便我们自己尝试代码。另外请发布您使用的系统类型:CPU、RAM、OS、MATLAB 版本,这样我们可以查看它是否与硬件/软件相关。
  • Coeffnames 来自“fit”,当您使用 Fourier 调用“fit”时,Matlab 会自动给出它。 vect_waves 几乎是一个包含 500k 个样本的向量,其中包含一个信号,仅此而已([-1,1] 之间的一堆数字)。我在帖子上发布了有关我的硬件的更多信息。
  • 所以基本上这就是我拥有的所有代码。

标签: matlab regression curve-fitting continuous-fourier


【解决方案1】:

由于我不熟悉您的应用程序,我不确定是否可以对代码进行矢量化以提高性能。不过,我还有一些其他提示。

您应该考虑的一件事是preallocation of arrays。在这种情况下,您至少应该预先分配数组coef,因为我相信您在开始循环之前确实知道它的大小。

我建议的另一件事是profile your code。这将提供有关您的代码哪些部分最耗时的信息,帮助您集中精力提高这些部分的性能。

【讨论】:

  • 我尝试过预分配数组,但在这种情况下,它根本没有帮助。我不确定是否可以对我的代码进行矢量化,因为我需要使用 fit 函数 N 次,而不仅仅是一次。我猜“fit”函数很慢,所以我可能会考虑编写自己的函数来获取傅立叶级数系数​​,但只是想确定是否还有其他方法可以代替......
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多