【问题标题】:Warning for variables with function names in MatlabMatlab中带有函数名称的变量的警告
【发布时间】:2012-09-05 07:37:21
【问题描述】:

有时我不小心声明了具有函数名称的变量。

这是一个构造示例:

 max(4:5) % 5
 max(1:10)=10*ones(10,1); % oops, should be == instead  of = 
 max(4:5) % [10 10]

目前我总是很难找到这一点,尤其是我不经常使用的函数名称。

有什么方法可以让matlab对此给出警告吗?最好在屏幕右侧看到此内容以及其他警告,但我愿意接受其他建议。

【问题讨论】:

    标签: function matlab variables warnings variable-assignment


    【解决方案1】:

    由于 Matlab 允许您重载内置功能,因此在使用现有名称时不会收到任何警告。

    不过,有一些技巧可以将现有函数重载的风险降到最低:

    • 使用explicitFunctionNames。有函数maxIndex 而不是max 的可能性要小得多。

    • 经常使用“Tab”键。 Matlab 将自动完成路径上的函数(以及您之前声明的变量)。因此,如果变量自动完成,它已经存在。如果您不记得它是否也是一个函数,请按“F1”以查看是否存在它的帮助页面。

    • 使用函数而不是脚本,这样工作区中“错误”分配的变量就不会弄乱您的代码。

    【讨论】:

    • 制表符技巧确实是检查您要使用的单词是否“干净”的好方法。如果变量已经放在工作区中,它仍然可能会给出假阴性。
    • @DennisJaheruddin:使用函数而不是脚本可以解决这个问题。查看我的编辑。
    【解决方案2】:

    我很确定 mlint 也可以检查这一点。

    通常我会尽可能地将代码包装到函数中。这样,这种覆盖的 范围 被限制在函数的范围内 - 所以除了偶然的假设之外,没有持久的问题。

    【讨论】:

    • 我试图在 mlint 首选项中找到它,但没有成功。即使启用所有选项后,一个简单的测试文件仍然没有 mlint 警告:max=2:10;结果=最大值(3:4);是否有更高级的方法来更改不在首选项屏幕中的 mlint 设置?
    • 我看到没有具体的警告。但有两个有助于识别此类问题:变量 已使用但可能未设置(脚本),第一次使用 max 时会发出警告。还有一个通常将结果存储在一个变量中,a = max(1:10)=10*ones(10,1) 将被标记为错误。
    • 我想只有在我尝试在命令窗口中进行一些快速评估时才会困扰我。至少这条评论向我保证,它不可能潜入我的代码而不被注意到。
    【解决方案3】:

    如有疑问,请检查:

    exist max
    ans = 
      5
    

    查看help exist,您可以看到“max”是一个函数,不应作为变量赋值。

     >> help exist
    exist  Check if variables or functions are defined.
    exist('A') returns:
      0 if A does not exist
      1 if A is a variable in the workspace
      2 if A is an M-file on MATLAB's search path.  It also returns 2 when
           A is the full pathname to a file or when A is the name of an
           ordinary file on MATLAB's search path
      3 if A is a MEX-file on MATLAB's search path
      4 if A is a MDL-file on MATLAB's search path
      5 if A is a built-in MATLAB function
      6 if A is a P-file on MATLAB's search path
      7 if A is a directory
      8 if A is a class (exist returns 0 for Java classes if you
        start MATLAB with the -nojvm option.)
    

    【讨论】:

    • 如果我遇到一个奇怪的问题,我想这可以帮助我事后检查一些变量:停止程序,保存所有变量名的列表,清除所有变量,然后在所有变量上使用存在名字。但是,最好有一种方法可以在问题发生之前警告我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2017-05-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多