matlab - 循环矢量化
问题描述
我在频域中应用滤波功能。因为我正在处理大量数据,所以我想对下面显示的 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;
解决方案
对于整个矩阵的向量算术,您不需要任何索引,只需使用数组运算符, .*
, ./
, .^
。但是当只使用数组的一部分作为操作数时,您需要使用其中一种索引方法。请记住,数组的所有输入和输出范围都应具有兼容的大小。
再次检查括号,但它是这样的:
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
中 ,B
和C
具有不同的大小,但是A(3:end)
和B(1:2, 2)'
都是 1 乘 2 并且代码运行没有问题。尝试运行它并评估代码的不同部分以查看索引是如何工作的。
推荐阅读
- php - PayPal Checkout : LiveEnvironment class not found
- java - 如何在同一个查询中检查多个 ID?
- java - Java Jackson Restlet JSON 与 .NET (Newtonsoft) 客户端使用的多态对象
- python - AttributeError:模块“tensorflow.python.keras.backend”没有属性“get_graph”
- git - 移动创建分支的提交
- android - android studio 中 res/values/colors.xml 的默认值
- ios - 如何使用官方 App Store Connect API 创建和请求类型为“Apple Development”或“Apple Distribution”的证书?
- iis-8 - IIS url 将 http 重写为 https 子域 404 错误
- html - Safari 浏览器错误的页脚
- javascript - 使用 onerror 为不支持的浏览器提供 .webp 图像是否安全?