首页 > 解决方案 > 循环矢量化

问题描述

我在频域中应用滤波功能。因为我正在处理大量数据,所以我想对下面显示的 for 循环进行矢量化。任何帮助,将不胜感激。


N = 2^nextpow2(length(signal));
Y = fft(signal,N);

df=1/(N*dt);
freq=0:df:N/2*df-df;
ff=freq./fccutlow;

H=zeros(1,length(N));
for i=2:length(ff)
   
    H(i)= sqrt((ff(i).^(2*nOrder)))./sqrt(((1+ff(i).^(2*nOrder))));
    Y(i)= Y(i).*H(i);
    Y(length(Y)-i+2)=Y(length(Y)-i+2).*H(i);
end
Y1= (real(ifft(Y,N)))';
Y1=Y1(1:length(signal));
filt_signal(1,:)=Y1;

标签: matlabfilteringvectorization

解决方案


对于整个矩阵的向量算术,您不需要任何索引,只需使用数组运算符, .*, ./, .^。但是当只使用数组的一部分作为操作数时,您需要使用其中一种索引方法。请记住,数组的所有输入和输出范围都应具有兼容的大小

再次检查括号,但它是这样的:

H = sqrt((ff.^(2*nOrder)))./sqrt(((1+ff.^(2*nOrder))));
Y= Y.*H;
Y(end-((1:length(ff))+2))=Y(end-((1:length(ff))+2)).*H;

一个例子:请注意,矩阵本身是否具有相同的大小并不重要,但操作数必须具有兼容的大小:

A = 1:4;         % 1x4
B = magic(3);    % 3x3
C = zeros(3, 1); % 3x1

C([1 3]) = A(3:end).*B(1:2, 2)';

尽管在此示例A中 ,BC具有不同的大小,但是A(3:end)B(1:2, 2)'都是 1 乘 2 并且代码运行没有问题。尝试运行它并评估代码的不同部分以查看索引是如何工作的。


推荐阅读