5

似乎我的 MATLAB 名称与我的一个名为“annotation”的变量和内置的 MATLAB 函数“annotation”发生冲突。

在我的函数中,我正在加载一个包含变量注释的 .mat 文件,然后尝试将其用作另一个函数的参数。一个最小的工作示例如下所示:

function test()

    filenames = { 'file1.mat', 'file2.mat', 'file3.mat' };

    for i = 1:numel(filenames)
        in_file = char(filenames{i});
        out_file = strrep(in_file, '.mat', '_out.mat');

        prepare(out_file); % do something with the out file

        load(out_file);  % contains one variable named "annotation"
        which annotation % just to be sure

        other_function(annotation);
    end
end

function prepare(filename)
    annotation = rand(25, 1);
    save(filename);
end

function other_function(annotation)
    whos % just a stub - see whether it has been called
end

现在,在我的函数准备中,我确保文件包含一个名为“annotation”的变量。当我在主函数的循环中加载它时,“which”命令告诉我它作为变量存在,但在调用 other_function 时,MATLAB 尝试调用函数“annotation”:

注释是一个变量。

???在 71 处使用 ==> 注释时出错

没有足够的输入参数

==> 14 点测试中的错误

        other_function(annotation);

我很困惑,因为我在程序的几个部分中使用了变量名“annotation”,也作为函数调用中的参数。我能想象的唯一解释是 MATLAB 以某种方式预编译了我的代码——在“编译时”,变量“注释”是不可见的。但是,在运行时可以从“which”命令的输出中看到它。

任何帮助将不胜感激!提前谢谢了。

注意:我使用的是 MATLAB 7.12.0 (R2011a)。

4

3 回答 3

2

这是一个非常模糊的问题!这是 Mathwork 的糟糕设计。我什至会称其为错误,看看他们是否同意很有趣。

annnotation = 2;简短的回答:您可以通过在代码行上方的任何位置添加该行来“修复”此问题load(out_file);。或者annotation = "roger";or annotation = false;,你注释什么类型的变量并不重要,只要你明确地强制它成为你代码中的一个变量。

您编写的代码没有明确引用变量annotationannotation恰好是您加载到函数工作区的 matlab 文件中的变量名称。不知何故,这不会引发运行时错误,它只是工作错误,我称之为错误,但 matlab 可能会说这是一个记录的限制。在http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html#f4-75258上查看他们的文档并告诉我您的想法。该文档似乎适用于嵌套函数,而您的 main 函数肯定不是。很明显,您的线other_function(annotation)应该在与它看到的正上方annotation相同的范围内看到。which annotation(我刚刚做了那个测试,它说annotation is a variable)。

这是一个显示问题的最小程序:

function test()
  prepare('test.mat'); % writes i
  load('test.mat');  % contains one variable named "annotation"

  which annotation
  other_function(annotation);
end

function prepare(filename)
  annotation = 42; % the answer is 42
  save(filename);
end

function other_function(poodle)
  disp(poodle);
end

我邀请您使用该页面上的“报告错误”链接在http://www.mathworks.com/support/bugreports上将此作为错误报告提交!如果你不想,我会报告它,让我知道。

于 2012-05-02T14:19:40.113 回答
0

这有点奇怪!我发现了同样的事情。基本上,工作区变量不应该在内部函数的范围内(尽管它们来自内部脚本)。

如果这样做load(out_file),则将该文件的内容加载到工作区中。所以他们不应该在范围内,我相信。因此,我很惊讶which(annotation)将其称为变量,但对于annotation超出范围并不感到惊讶。(实际上,看起来 Matlab 确实将变量放在范围内。)

我认为你关于某种预处理的想法annotation听起来是合理的。例如,如果您替换other_function(annotation)eval('other_function(annotation);'),那么它可能会起作用(尽管我并不是说您应该使用eval, 永远)。

解决此问题的最佳方法是执行以下操作:

data = load(out_file);
annotation = data.annotation;

因此,加载out_file到结构中,然后从那里访问变量。

于 2012-05-02T11:57:04.940 回答
0

这是(现在?)记录的行为:

http://www.mathworks.com/help/matlab/import_export/troubleshooting-loading-variables-within-a-function.html

于 2013-03-11T07:55:27.700 回答