我现在需要提高我的代码的速度,因此我想使用矢量化而不是循环。下面的代码是在我的计算过程中经常被调用的代码的(非常)简化版本:
T=10; n=5; w0 = 25000; w1 = 23000; b0 = 15000;
vec = zeros(1,T+2*n+1); vec(1:n+1) = w0; vec(n+2:n+T+1) = b0; vec(n+T+2:T+2*n+2) = w1;
ref0=zeros(1,n);
for i = 1:n
ref0(i) = sum(vec(T+i+2:n+T+i+2));
end我试图使用向量化,但不幸的是,它似乎不起作用,因为在向量索引过程中,只有向量i的第一个条目用作输入:
i = 1:n;
ref1 = sum(vec(T+i+2:n+T+i+2));输出如下:
ref0 =
106000 114000 122000 130000 138000
ref1 =
106000有没有什么方法可以使用矢量化来实现ref1与ref0给出相同的输出?这可能是非常明显的,但我似乎不会在这里更进一步。我非常感谢您的帮助!在此之前非常感谢。
发布于 2017-02-02 00:59:48
你可以使用movsum代替你的循环:
ref1 = movsum(vec(T+3:T+2*n+2),n+1,'Endpoints','discard');发布于 2017-02-02 04:26:51
如果n和T的值很小,并且vec是一个很长的向量,那么这应该是非常有效的:
ref1 = cumsum(vec);
ref1 = ref1(T+n+3:end) - ref1(T+2:end-n-1);发布于 2017-02-02 01:06:07
卷积也有效:
c = conv(ones(1,n+1), vec(T+3:2*n+T+2), 'same' );
ref2 = c(1:end-1);https://stackoverflow.com/questions/41983888
复制相似问题