首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nlfilter两次获取相同的值

nlfilter两次获取相同的值
EN

Stack Overflow用户
提问于 2011-04-17 15:18:22
回答 2查看 603关注 0票数 1

我使用nlfilter作为我的测试函数,如下所示:

代码语言:javascript
复制
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,依此类推。为甚麽呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-17 16:48:25

这没什么好担心的。这是因为nlfilter需要评估您的函数以了解要创建哪种类型的输出。因此,它在开始在图像中移动之前使用一次feval。这个feval调用的输出是您第一次看到的。

在nlfilter代码中:

代码语言:javascript
复制
% 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循环中。这意味着您观察到的“重复”值不会影响您的最终输出矩阵,您无需担心。

票数 1
EN

Stack Overflow用户

发布于 2011-04-17 16:54:00

我希望您知道length函数是做什么的?它给出的不是向量的欧几里得长度,而是向量的最大维数(因此,在您的例子中,它应该是4)。如果需要欧几里得长度(或2范数),请改用函数norm。如果您的代码执行了正确的操作,则可能需要使用以下内容:

代码语言:javascript
复制
sz = size(I,2);
h = sz - (sz+1)/2 - ld;

在您的示例中,这意味着根据您提供的滞后,输出应该是恒定的。还要注意的是,您可能希望在子函数的每一行后面都放上分号,并且使用clear all作为函数的第一行是没有用的,因为函数总是在其自己的工作区中执行(这将清除持久变量或全局变量,但您不会在代码中使用它们)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5692164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档