循环向量化
Vectorization for loop
我正在尝试矢量化这个 for 循环。有什么想法吗?
D = 1x8851;
for k = 1:length(D)-1
P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);
end
对于符号不同的两个事物,表示它们的乘积是负数:
P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);
等同于:
P(k) = ( D(k) * D(k+1) ) <= 0;
通过简单地将操作转换为 element-wise 操作,这很容易向量化:
P = ( D(1:end-1) .* D(2:end) ) <= 0;
原始构造可以用相同的方式向量化,&
和 |
是 &&
和 ||
的 element-wise 对应物:
P = ((D(1:end-1)<=0)&(D(2:end)>=0))|((D(1:end-1)>=0)&(D(2:end))<0);
但是,较短的表达式需要较少的中间矩阵和较少的操作,因此会更快。
我正在尝试矢量化这个 for 循环。有什么想法吗?
D = 1x8851;
for k = 1:length(D)-1
P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);
end
对于符号不同的两个事物,表示它们的乘积是负数:
P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);
等同于:
P(k) = ( D(k) * D(k+1) ) <= 0;
通过简单地将操作转换为 element-wise 操作,这很容易向量化:
P = ( D(1:end-1) .* D(2:end) ) <= 0;
原始构造可以用相同的方式向量化,&
和 |
是 &&
和 ||
的 element-wise 对应物:
P = ((D(1:end-1)<=0)&(D(2:end)>=0))|((D(1:end-1)>=0)&(D(2:end))<0);
但是,较短的表达式需要较少的中间矩阵和较少的操作,因此会更快。