Matlab 矢量化与矢量索引

Matlab 矢量化与矢量索引,matlab,indexing,vectorization,Matlab,Indexing,Vectorization,我目前需要加快代码的速度,因此希望使用矢量化而不是循环。以下代码是该代码的(非常)简化版本,在我的计算过程中经常被调用: 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 r

我目前需要加快代码的速度,因此希望使用矢量化而不是循环。以下代码是该代码的(非常)简化版本,在我的计算过程中经常被调用:

    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相同的输出?这可能是非常明显的,但我似乎没有在这里进一步。我非常感谢你的帮助!提前非常感谢。

您可以使用以下内容代替循环:

ref1 = movsum(vec(T+3:T+2*n+2),n+1,'Endpoints','discard');

卷积也起作用:

c = conv(ones(1,n+1), vec(T+3:2*n+T+2), 'same' );
ref2 = c(1:end-1);

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

ref1 = cumsum(vec);
ref1 = ref1(T+n+3:end) - ref1(T+2:end-n-1);

这是因为冒号运算符
不接受向量作为输入,并且只使用向量输入的第一个元素,而不是使用向量转换并不一定意味着更快。您是否分析了代码?
vec
初始化为
T+2*n+1
列,然后为列
2*n+T+2
分配一个值。。。不是矢量化问题,只是可能需要纠正?你应该后退一步,不要考虑“矢量化”,而是考虑“分析性”。似乎您正在构造分段线性采样函数。能否将开始时的参数重新格式化为两条线(包括交点)的参数?如果是这样的话,那就比任何数字运算、矢量化或其他方式都要好。upvote因为它是一个与movsum不同的函数,但特别是对于大向量“vec”,这应该比使用movsum慢,因为第二行也不是一个简单的操作。有Matlab的人可能会给它一些时间安排。