'nlfilter'如何填充矩阵?

时间:2011-04-18 10:03:10

标签: matlab

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

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行 - 第1行时,它将是第2行 - 第1行+第1行 - 第2行后跟2个零,依此类推。

如果我只是创建一个11X11的随机矩阵并从diagvar运行行,它会从矩阵中选择中心值并按预期​​进行。

2 个答案:

答案 0 :(得分:2)

您将fh定义为输入变量,但随后使用以下行覆盖fh

fh = @dirvar,@diagvar;

这条线在做什么?好吧,左侧有一个变量,右侧有function handlescomma-separated list。 MATLAB将如何处理这个问题?好吧,逗号分隔列表中的第一个条目@dirvar将分配给fh,第二个条目@diagvar将分配给。因此,此行始终fh设置为@dirvar,这就是为什么您总是得到一个结果,就像使用dirvar一样。

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

答案 1 :(得分:0)

尝试拨打

funct(@diagvar)

代替;并删除以下行:

fh = @dirvar,@diagvar;

您现在正在做的事情,不会改变您正在使用的功能。