首页 文章

如何忽略一个案例并在对一个区间中的值求和时保持求和?

提问于
浏览
1

我有一个值H,例如H = 3 . 我试图在每个t,c(t)之前的H项(之前的3项)和之后的H项(之后的3项)t中求和 . 例如对于t,我希望有:

c(t-3) + c(t-2)+ c(t-1) + c(t) + c(t+1) + c(t+2) +c(t+3)

这是完美的代码:

%just consider some values a C
    data = importdata('2.txt');  
    C = data.data.';
    C = C';

    N = length(C);
    H = 3;
    w = ones(2 * H + 1, 1);
    Lambda= NaN * zeros(N, 1);
    L= NaN * zeros(N, 1);
    U= NaN * zeros(N, 1);
    for t = (H+1):(N-H-1)
        Lambda(t) = sum(w .* C(t-H:t+H)) / sum(w);
        L(t) = poissinv(0.005, Lambda(t));
        U(t) = poissinv(0.995, Lambda(t));
    end

现在我正在尝试做的事情并没有成功:我不想在Lambda(t)平均值中得出C(t) . 我的意思是在时间t,我开始将每个t的从-H到H的项目求和,但是当H = t时不是 . 我只是想忽略t = H的情况并继续求和 . 我非常感谢任何建议,因为我是MATLAB的新手而且我被卡住了!

1 回答

  • 0

    我没有彻底查看你的代码,但你所描述的内容听起来像是基本的卷积:

    所以忽略 w (我认为它只是一个常数的乘法?即 1/6 ?)

    kernel = [1, 1, 1, 0, 1, 1, 1];
    Lambda = conv(C, [1, 1, 1, 0, 1, 1, 1], 'same')
    

    卷积对 C 移位 kernel 并取一个和或重叠元素的元素乘积 . 因此,为了将前后的三个元素相加,我们只需乘以一个中心元素(即 C(t) ),我们只需乘以零,这样它就不会对总和产生影响 .

    我认为使用 w 你可以去

    kernel = kernel/sum(kernel)    %//i.e. divide by 6 which is the same as 2*H
    

    你也可以将它概括为相当定义 kernel ,如下所示:

    kernel = ones(2 * H + 1, 1)/(2*H);
    kernel(H+1) = 0;
    

    所以现在你完成(矢量化!)代码是:

    data = importdata('2.txt');  
    C = data.data;
    H = 3;
    
    kernel = ones(2 * H + 1, 1)/(2*H);
    kernel(H+1) = 0;
    
    Lambda = conv(C, kernel, 'same');
    L = poissinv(0.005, Lambda);
    U = poissinv(0.995, Lambda);
    

相关问题