【问题标题】:How does 'nlfilter' pad a matrix?'nlfilter' 如何填充矩阵?
【发布时间】:2011-08-07 18:13:44
【问题描述】:

我正在矩阵上测试包含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 中的一样),而不是选择对角线的元素并进行填充。对于第一行,我希望它从第一行中选择第一个元素和 3 个零,依此类推,直到行尾;当涉及到第 2 行 - 第一个元素时,它将是第 2 行 - 第 1 个元素 + 第 1 行 - 第 2 个元素,后跟 2 个零,依此类推。

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    fh = @dirvar,@diagvar;
    

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

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

    【讨论】:

    • 选项#3 成功了。事实上#2 也有效,但我使用了#3。非常感谢!
    【解决方案2】:

    尝试调用

    funct(@diagvar)
    

    相反;并删除以下行:

    fh = @dirvar,@diagvar;
    

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

    【讨论】:

    • 正如您所建议的,如果我在删除 fh = @dirvar,@diagvar; 后调用 funct(@diagvar),则会导致错误:??? Error using ==> feval Undefined function or method 'diagvar' for input arguments of type 'double'. Error in ==> nlfilter at 61 b = mkconstarray(class(feval(fun,aa(1+rows,1+cols),params{:})), 0, size(a)); Error in ==> funct at 6 A = nlfilter(I, [7 7], fh);。另一方面,如果我只有fh = @diagvar 并使用funct(@diagvar) 调用,则该函数可以完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2021-08-21
    • 1970-01-01
    • 2014-03-22
    • 2016-10-28
    • 2018-09-20
    • 2010-10-15
    相关资源
    最近更新 更多