如何忽略一个案例并在一个区间内总结值时保持求和?

时间:2014-10-03 07:07:52

标签: matlab

我有一个值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 :(得分:0)

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

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

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

卷积将kernelC相对应,并获取重叠元素的总和或元素乘积。因此,为了对前后三个元素进行求和,我们只需乘以一个并省去中心元素(即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);