首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量化和向量索引

向量化和向量索引
EN

Stack Overflow用户
提问于 2017-02-01 23:45:00
回答 3查看 156关注 0票数 4

我现在需要提高我的代码的速度,因此我想使用矢量化而不是循环。下面的代码是在我的计算过程中经常被调用的代码的(非常)简化版本:

代码语言:javascript
复制
    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的第一个条目用作输入:

代码语言:javascript
复制
i = 1:n;
ref1 = sum(vec(T+i+2:n+T+i+2));

输出如下:

代码语言:javascript
复制
ref0 =

  106000      114000      122000      130000      138000

ref1 =

  106000

有没有什么方法可以使用矢量化来实现ref1与ref0给出相同的输出?这可能是非常明显的,但我似乎不会在这里更进一步。我非常感谢您的帮助!在此之前非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-02 00:59:48

你可以使用movsum代替你的循环:

代码语言:javascript
复制
ref1 = movsum(vec(T+3:T+2*n+2),n+1,'Endpoints','discard');
票数 5
EN

Stack Overflow用户

发布于 2017-02-02 04:26:51

如果nT的值很小,并且vec是一个很长的向量,那么这应该是非常有效的:

代码语言:javascript
复制
ref1 = cumsum(vec);
ref1 = ref1(T+n+3:end) - ref1(T+2:end-n-1);
票数 4
EN

Stack Overflow用户

发布于 2017-02-02 01:06:07

卷积也有效:

代码语言:javascript
复制
c = conv(ones(1,n+1), vec(T+3:2*n+T+2), 'same' );
ref2 = c(1:end-1);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41983888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档