【问题标题】:For each element in vector, sum previous n elements对于向量中的每个元素,将前 n 个元素相加
【发布时间】:2014-07-01 08:30:44
【问题描述】:

我正在尝试编写一个函数,将每个元素的前 n 个元素相加

    v = [1 1 1 1 1 1];
    res = sumLastN(v,3);
    res = [0 0 3 3 3 3];

到目前为止,我已经编写了以下函数

    function [res] = sumLastN(vec,ppts)

        if iscolumn(vec)~=1
            error('First argument must be a column vector')
        end

        sz_x = size(vec,1);
        res = zeros(sz_x,1);
        if sz_x > ppts
            for jj = 1:ppts
                res(ppts:end,1) = res(ppts:end,1) + ...
                    vec(jj:end-ppts+jj,1);
            end
    %         for jj = ppts:sz_x
    %             res(jj,1) = sum(vec(jj-ppts+1:jj,1));
    %         end
        end

    end

大约有 2000 个向量,大约 100 万个元素,所以我想知道是否有人可以给我任何关于如何加快函数速度的建议。

【问题讨论】:

    标签: matlab optimization sum


    【解决方案1】:

    使用 cumsum 应该快得多:

    function [res] = sumLastN(vec,ppts)
    w=cumsum(vec)
    res=[zeros(1,ppts-1),w(ppts+1:end)-w(1:end-ppts)]
    end
    

    【讨论】:

      【解决方案2】:

      你基本上想要一个移动平均过滤器,只是没有平均。

      使用数字filter

      n = 3;
      v = [1 1 1 1 1 1];
      
      res = filter(ones(1,n),1,v)
      res =
               1     2     3     3     3     3
      

      我不明白为什么前两个元素应该为零,但为什么不:

      res(1:n-1) = 0
      res =
               0     0     3     3     3     3
      

      【讨论】:

        猜你喜欢
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 2012-11-08
        相关资源
        最近更新 更多