我有一个值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的新手而且我被卡住了!
答案 0 :(得分:0)
我没有彻底查看您的代码,但您所描述的内容听起来像是基本的卷积:
忽略w
(我认为它只是一个常数的乘法?即1/6
?)
kernel = [1, 1, 1, 0, 1, 1, 1];
Lambda = conv(C, [1, 1, 1, 0, 1, 1, 1], 'same')
卷积将kernel
与C
相对应,并获取重叠元素的总和或元素乘积。因此,为了对前后三个元素进行求和,我们只需乘以一个并省去中心元素(即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);