nlfilter两次取相同的值

| 我将ѭ0用作我的测试函数,如下所示:
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
。但是随后所有迭代都选择了下一个元素,第3个元素为
0.4162 0.9398 0.1058 0.1920
,第4个元素为
0.9398 0.1058 0.1920 0.5201
,依此类推。为什么会这样呢?     
已邀请:
这没什么好担心的。发生这种情况是因为nlfilter需要评估您的函数以知道要创建哪种输出。因此,它在开始移动图像之前使用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
作为EW的第一个输出,您对eval的第4行调用是观察到的,但是除了使b矩阵成为正确的类之外,它不用于其他任何事情。所有正确的迭代都在下面的for循环中进行。这意味着您观察到的\“ duplicate \”值不会影响最终的输出矩阵,因此您不必担心。     
我希望您知道
length
函数的作用是什么?它不会为您提供矢量的欧几里得长度,而是为您提供矢量的最大尺寸(因此,在您的情况下,应为4)。如果需要欧几里得长度(或2范数),请改用函数
norm
。如果您的代码执行正确的操作,则可能需要使用类似以下内容的代码:
sz = size(I,2);
h = sz - (sz+1)/2 - ld;
在您的示例中,这意味着根据您提供的滞后,输出应该是恒定的。还要注意,您可能希望在分函数的每一行之后加上分号,并且将“ 10”用作函数的第一行是没有用的,因为函数将始终在其自己的工作空间中执行(但是,这将清除持久变量或全局变量,但是您不在代码中使用它们)。     

要回复问题请先登录注册