嵌套函数在octave / matlab

时间:2016-12-24 23:26:27

标签: matlab octave

我试图在我的八度环境中使用名为optprop的matlab模块。似乎代码有一些兼容性问题。特别是当我试着打电话时

xyz_image = rgb2xyz(rgb_image)

我收到以下错误:

error: 'cwf' undefined near line 1809 column 15
error: called from
    astm>getcwf at line 1809 column 4
    astm at line 1843 column 5
    makecwf>tryastm at line 74 column 5
    makecwf at line 59 column 9
    wpt at line 33 column 6
    i_xyz2xyz at line 28 column 6
    i_rgb2xyz at line 54 column 5
    optproc at line 315 column 7
    rgb2xyz at line 49 column 33
    rgb2xyz_norm2 at line 10 column 12

导致错误的代码在astm.m文件中。该文件定义了函数:

function z=astm(op,varargin)
    persistent cwf lam
    %cwf initialization

    %nested function
    function z=getcwf(name, varargin)
        %...
        z=cwf;  %here cwf is undefined
        %...

    %actual nested function call
    z=getcwf(varargin{:});
    %...

从我的观点来看,这里的一切都很好。嵌套函数应该看到cwf。即使我使用octave,它也应该支持所有内容,因为optprop包已经在2007年上次更新了。我还尝试了嵌套函数,下面的代码工作正常:

function nested_function_test()
    disp('inside outer function');
    local_variable = 'local string content';

    function nested_function()
        disp('inside nested function');
        disp(local_variable);
    end

    disp('after nested function declaration');
    nested_function();
end

我认为这些代码块之间没有任何区别。为什么cwf未定义?

更新:

以防万一。当前的解决方法对我有用:

function z=getcwf(name, varargin)
    cwf = varargin{end - 1};
    lam = varargin{end};
    %...


varargin{end + 1} = cwf;
varargin{end + 1} = lam;
z=getcwf(varargin{:});

1 个答案:

答案 0 :(得分:3)

这似乎是八度音中的明确错误。在你的MWE中,如果你使local_variable持久化,那么将会复制错误的行为。即。

function nested_function_test()
  disp('inside outer function');
  persistent local_variable;  % <-- change here, make local_variable persistent
  local_variable = 'local string content';

  function nested_function()
    disp('inside nested function');
    disp(local_variable);  % <-- local_variable no longer visible
  end

  disp('after nested function declaration');
  nested_function();
end

以上将在matlab中工作,并在八度音程中失败。

特别是在matlab中,在嵌套函数内部的调试会话期间,如果键入whos,您将看到两个变量堆栈,一个(空)工作空间本地嵌套函数,另一个对应于外部函数,嵌套的内部函数可以访问,包含持久变量。

在八度音程中,在嵌套函数中键入whos只会返回一个空的本地工作空间而不会返回任何其他内容。 (如果删除persistent行,您会看到八度音阶似乎只是将外部局部变量导入本地工作空间,而不是同时访问内部和外部,所以它似乎八度音程有不同的方法来创建嵌套函数)。

我建议您将此文件作为octave bug tracker 1 中的正式错误提交。似乎开发人员可能将持久变量视为一种特殊情况,并忘记在嵌套函数的特定实现中考虑这种行为。大概是&#39; import&#39; step查看特定位置的变量,持久变量存储在别处并丢失?

1:啊,看来这个bug已经被报告并确认,但尚未修复:https://savannah.gnu.org/bugs/index.php?42126