'nlfilter'如何填充矩阵?

问题描述:

我正在测试矩阵上包含nlfilter的函数。为此,我创建了一个随机11X11矩阵,并在nlfilter的帮助下使用7x7移动窗口。我的功能如下:'nlfilter'如何填充矩阵?

function funct(fh) 
I = rand(11,11) 
ld = input('Enter the lag = ') % prompt for lag distance 
fh = @dirvar,@diagvar; 
A = nlfilter(I, [7 7], fh); 


% Subfunction 
    function [h] = dirvar(I) 
     c = (size(I)+1)/2 
     EW = I(c(1),c(2):end) 
     h = length(EW) - ld 
    end 

% Subfunction 
    function [h] = diagvar(I) 
     c = (size(I)+1)/2 
     NE = diag(I(c(1):-1:1,c(2):end)) 
     h = length(NE) - ld 
    end 
end 

当运行funct('dirvar')它要求滞后,选择第一行的4个元素,并通过元件前进元件。从第一行的第9到第11个元素,它将0作为最后的元素(自动填充),这是预期的行为。

但是,当我运行funct('diagvar')函数行为相同(如在dirvar),而不是对角线选择元素和填充。对于第一行,我期望它从第一行和三个零中选择第一个元素,依此类推直到行尾;当涉及到第二行时 - 第一个元素将是第二行 - 第一个元素+第一行 - 第二个元素后面跟着2个零等等。

如果我刚创建顺序11×11个的随机矩阵并运行diagvar它从矩阵中选择的中心值和进步如预期线。

您定义fh作为输入变量,但你覆盖fh有以下行:

fh = @dirvar,@diagvar; 

,什么是这一行做什么?那么,左侧有一个变量,右侧有一个comma-separated list有两个function handles。 MATLAB会用这个做什么?那么,在逗号分隔列表中的第一个条目@dirvar将被分配到fh,而且第二条目@diagvar将被分配到什么。因此,这条线总是fh等于@dirvar,这就是为什么你总是得到一个结果,就好像dirvar正在使用。

如果你想通过输入一个字符串参数到funct来选择一个嵌套函数,你应该看看this answer I gave to another SO question,特别是选项#2和#3。

+0

选项#3有窍门。事实上#2也有效,但我用#3。非常感谢! – 2011-04-18 14:39:11

尝试调用

funct(@diagvar) 

代替;并删除以下行:

fh = @dirvar,@diagvar; 

你现在在做什么,不会改变你正在使用的功能。

+0

如你所说,如果我叫'本功能(@diagvar)''删除FH = @ dirvar,@ diagvar后;',是导致错误:'???错误使用==> feval 对于'double'类型的输入参数,未定义函数或方法'diagvar'。 错误==> nlfilter在61 B = mkconstarray(类(feval(乐趣,AA(1个+行,1个+ COLS),则params {:})),0,大小的(a)); 错误==>本功能在6 A = nlfilter(I,[7 7],FH);'。另一方面,如果我只有'fh = @ diagvar',并且使用'funct(@diagvar)'调用,则该函数可以完美工作。 – 2011-04-18 12:36:56