【问题标题】:Loop vectorization [closed]循环矢量化[关闭]
【发布时间】:2021-03-04 19:29:42
【问题描述】:

我正在频域中应用滤波功能。因为我正在处理大量数据,所以我想对下面显示的 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;

【问题讨论】:

标签: matlab filtering vectorization


【解决方案1】:

对于整个矩阵的向量算术,您不需要任何索引,只需使用array operators.*./.^。但是当仅使用数组的一部分作为操作数时,您需要使用indexing methods 之一。请记住,数组的所有输入和输出范围都应为compatible sizes

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

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)';

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

【讨论】:

  • 感谢您的评论。 Y 数组的大小是 H 的两倍,矩阵乘法返回错误。
  • @user3087937 添加了一个示例和几个链接以供进一步阅读。
猜你喜欢
  • 2021-03-01
  • 2020-12-01
  • 2012-09-24
  • 2015-04-07
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2016-02-11
相关资源
最近更新 更多