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的人可能会给它一些时间安排。