我使用nlfilter作为我的测试函数,如下所示:
function funct
clear all;
clc;
I = rand(11,11);
ld = input('Enter the lag = ') % prompt for lag distance
A = nlfilter(I, [7 7], @dirvar);
% Subfunction
function [h] = dirvar(I)
c = (size(I)+1)/2
EW = I(c(1),c(2):end)
h = length(EW) - ld
end
end该函数运行良好,但预计nlfilter会逐个元素地进行,但在前两次迭代中,EW的值将是相同的0.2089 0.4162 0.9398 0.1058。然后,对于所有迭代,选择下一个元素,对于第三个元素是0.4162 0.9398 0.1058 0.1920,对于第四个元素是0.9398 0.1058 0.1920 0.5201,依此类推。为甚麽呢?
发布于 2011-04-17 16:48:25
这没什么好担心的。这是因为nlfilter需要评估您的函数以了解要创建哪种类型的输出。因此,它在开始在图像中移动之前使用一次feval。这个feval调用的输出是您第一次看到的。
在nlfilter代码中:
% Find out what output type to make.
rows = 0:(nhood(1)-1);
cols = 0:(nhood(2)-1);
b = mkconstarray(class(feval(fun,aa(1+rows,1+cols),params{:})), 0, size(a));
% Apply fun to each neighborhood of a
f = waitbar(0,'Applying neighborhood operation...');
for i=1:ma,
for j=1:na,
x = aa(i+rows,j+cols);
b(i,j) = feval(fun,x,params{:});
end
waitbar(i/ma)
end对eval的第四行调用是您观察到的EW的第一个输出,但除了使b矩阵成为正确的类之外,它并不用于任何其他操作。所有正确的迭代都发生在下面的for循环中。这意味着您观察到的“重复”值不会影响您的最终输出矩阵,您无需担心。
发布于 2011-04-17 16:54:00
我希望您知道length函数是做什么的?它给出的不是向量的欧几里得长度,而是向量的最大维数(因此,在您的例子中,它应该是4)。如果需要欧几里得长度(或2范数),请改用函数norm。如果您的代码执行了正确的操作,则可能需要使用以下内容:
sz = size(I,2);
h = sz - (sz+1)/2 - ld;在您的示例中,这意味着根据您提供的滞后,输出应该是恒定的。还要注意的是,您可能希望在子函数的每一行后面都放上分号,并且使用clear all作为函数的第一行是没有用的,因为函数总是在其自己的工作区中执行(这将清除持久变量或全局变量,但您不会在代码中使用它们)。
https://stackoverflow.com/questions/5692164
复制相似问题