Arrays Matlab:设置复数数组值很慢
我是Matlab新手。我目前正在试验傅立叶变换,并尝试实现一个频率滤波器(删除所有频率,但k_min和k_max之间的频率除外) 为了实现这一点,我删除了傅里叶变换图像中的各个像素。我正在使用以下代码:Arrays Matlab:设置复数数组值很慢,arrays,matlab,complex-numbers,Arrays,Matlab,Complex Numbers,我是Matlab新手。我目前正在试验傅立叶变换,并尝试实现一个频率滤波器(删除所有频率,但k_min和k_max之间的频率除外) 为了实现这一点,我删除了傅里叶变换图像中的各个像素。我正在使用以下代码: % Example values kmin = 0; kmax = 300; for i = 1:w for j = 1:h if norm([w/2, h/2] - [i,j]) < kmin || norm([w/2, h/2] - [i,j]) > k
% Example values
kmin = 0;
kmax = 300;
for i = 1:w
for j = 1:h
if norm([w/2, h/2] - [i,j]) < kmin || norm([w/2, h/2] - [i,j]) > kmax
Fs(j,i) = 0.0;
end
end
end
%示例值
kmin=0;
kmax=300;
对于i=1:w
对于j=1:h
如果范数([w/2,h/2]-[i,j])kmax
Fs(j,i)=0.0;
结束
结束
结束
我的图像大约是1000x600。因此,Fs是一个1000x600的复数数组。现在我的问题是:为什么这么慢?如果我将很少的像素设置为零(例如,kmin=10,kmax=infinite),那么代码运行速度很快,但是如果我必须将几乎所有像素设置为0.0(例如,kmin=0,kmax=10),则需要花费大量的时间来完成
我所做的就是将一些数组条目设置为零(最坏的情况是少于1000000个条目,可能是因子2,因为它们是复数)。为什么这需要几分钟的时间?:) 循环在Matlab中的速度往往较慢(尽管在最新版本中这一点有所改进)。更好,这意味着“同时”处理所有值,而不使用循环。在这种情况下,您可以使用和:
[ii jj]=ndgrid(1:w,1:h);%//创建所有组合
aux=sqrt((w/2-ii(:).^2+(h/2-jj(:).^2);%//计算范数
ind=(auxkmax);%//逻辑索引
Fs(ind)=0;
计算截止频率对应的指数,而不是根据指数计算频率并查看其是否属于回传
一旦您计算了n_-cutoff\u low
和n_-cutoff\u high
,将所有元素从1:n_-cutoff\u low
和从n_-cutoff\u high:end
设置为零既简单又快速
基本上,您可以使用fftshift从
norm([w/2, h/2] - [i,j]) < kmin
关于使用matlab在傅里叶域中屏蔽频率的一些细节:这对于OP的坏方法是一个很好的加速,但它仍然是一个坏方法。
norm([w/2, h/2] - [i,j]) < kmin
norm([i,j]) < kmin
i^2 + j^2 < kmin^2
j^2 < kmin^2 - i^2
j_cutoff = floor(sqrt(kmin^2 - i^2));
Fs(i,-j_cutoff:j_cutoff) = 0;