我正在测试矩阵上包含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
运行行,它会从矩阵中选择中心值并按预期进行。
答案 0 :(得分:2)
您将fh
定义为输入变量,但随后使用以下行覆盖fh
:
fh = @dirvar,@diagvar;
这条线在做什么?好吧,左侧有一个变量,右侧有function handles个comma-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;
您现在正在做的事情,不会改变您正在使用的功能。