Arrays Matlab:设置复数数组值很慢

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

我是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]) > 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;