我完全同意弗洛里斯的观点,但我会给你一些关于正在发生的事情的线索。根据您的问题,我假设您以前从未使用过 MATLAB,因此我强烈建议您尝试在线提供的许多教程中的一些。
function filter=gaussfilt(N)
这定义了函数的名称gaussfilt
、输入变量N
和输出变量filter
。您的 m 文件必须另存为gaussfilt.m
.
filter
是 MATLAB 中的许多内置函数之一,因此不是一个好的变量名。我建议你使用一个名称,例如gauss_filter
,或基本上其他任何东西。在您的情况下,这可能并不重要,因为您没有使用该filter
函数,但是,使用这样的名称是一个坏习惯。这也适用于size
,length
等名称max
。
alpha=N;
first=-(1-N/2)*exp(-(1-N/2)^2/alpha);
count=0;
这些行只不过是为变量名赋值。exp()
是自然指数。count
用于跟踪while
循环循环的次数。
while first<.1*(-(1530/4000*N-N/2)*exp(-(1530/4000*N-N/2)^2/alpha))
count=count+1;
alpha=N*500*count;
first=-(1-N/2)*exp(-(1-N/2)^2/alpha);
end
只要满足以下条件while
,就会计算介于两者之间的所有内容。end
条件应该是不言自明的。
first < .1*(-(1530/4000*N-N/2)*exp(-(1530/4000*N-N/2)^2/alpha))
count
递增,以便您可以跟踪循环执行了多少次。但是,它从未使用过,因此在这种情况下是不必要的。但是,我建议您保留计数器,并在while
循环中包含另一个条件,即它应该停止运行 ifcount > 1e6
或其他一些较大的数字。这样,您将避免循环在不满足其他条件的情况下永远运行。
for n=1:N
filter(n)=-(n-N/2)*exp(-(n-N/2)^2/alpha); % d/dt of a gaussian
end
for n = 1:N
是一个将运行N
多次的循环,其中n
将是1
第一次,2
第二次等等。filter(n) = ..
将值分配给变量中的n
第 th 个位置filter
,从而创建一个长度为 N 的向量。这是创建向量的一种不好的坏方法。您应该始终为向量分配内存,以避免向量在循环内增长。“增长”的向量非常非常慢。因此,在开始循环之前,您应该执行以下操作:
filter = zeros(1,N);
这会创建一个零向量。这可能有点太多了,但分配值的更好方法filter
是使用arrayfun
:
filter = arrayfun(@(n) (-(n-N/2) * exp(-(n-N/2)^2 / alpha)), 1:N);
在这个答案中查看第 6 点以了解原因。
最后一行:
filter=filter/sum(abs(filter));
好吧,您将filter
值除以值的总和,从而创建filter
一个总和等于的新值1
。这是您将从函数中获得的输出。
使用该函数时,必须编写如下内容:
filter_vector = gaussfilt(N) % where N is an integer
最后一点,使用空格!它更容易阅读!
再次,我推荐一些 MATLAB 教程......