【问题标题】:Removing preallocating warning when preallocating is done in another file在另一个文件中进行预分配时删除预分配警告
【发布时间】:2015-03-09 15:04:03
【问题描述】:

我有一些参数在 main.m 中的每个循环迭代中改变大小。我已将预分配放在另一个名为 preallocation.m 的脚本中。

当预分配被放置在另一个脚本中时,我会从 Matlab 收到有关主脚本中每个参数的警告,关于考虑预分配以提高速度。

有没有办法消除这些警告?如果我添加了另一个需要预分配的参数并且忘记了预分配,我希望收到该参数的警告。

【问题讨论】:

    标签: matlab allocation


    【解决方案1】:

    我很想使您的预分配脚本成为一个函数。然后你可以写类似的东西

    [myvar1,myvar2,myvar3] = preallocate();
    

    这将使您可以一目了然地查看所有预分配的变量,并且还会使 mlint 保持安静。

    【讨论】:

    • 我在另一个文件中预分配以提高清洁度。使我的预分配脚本成为函数会由于大量输出而降低清洁度,不是吗?
    • 我更喜欢明确的分配...这有助于展示你所做的事情。
    • 我会让它们全部功能......从长远来看会更好。这是一场噩梦调试(其他人或您自己的旧代码),其中变量在其他脚本中被修改,而这些脚本又可能调用其他脚本等.....它是潜在错误的常见来源
    【解决方案2】:

    在我的 MATLAB 版本 (R2014b) 中,这是通过右键单击上面带有波浪形红线的变量,然后选择选项 Suppress "The variable myVar appears to..." 来完成的。然后,您可以选择禁止该单行、整个文件中的所有此类警告或所有文件中的所有此类警告。

    编辑:如果您的 MATLAB 版本没有此上下文菜单选项,您可以将 %#ok<SAGROW> 添加到违规行的末尾,如下所示:

    someVar(ii+1) = someVar(ii) + someConstant;    %#ok<SAGROW>
    

    如果您不希望出现这些警告并且不使用返回许多变量的预分配函数,您还可以执行以下操作:

    function init = preallocate()
        init.a = some stuff;
        init.b = some stuff;
        ...
    end
    
    %% actual script
    init = preallocate()
    structvars(init);       % using structvars from file exchange
    

    structvars 可以找到here。请注意,我自己没有尝试过这个包,所以我不确定它的效果和速度。

    【讨论】:

    • 所以Matlab 无法检查main.m 中提到的文件中的预分配?您的解决方案有效,但并不理想。如果我需要在同一行发表评论,我必须在“%#ok”之后进行。更重要的是,我不知道行上的所有变量是否都是预先分配的。据我所知,在使用“%#ok”时,行的预分配检查被禁用。
    • 您可以创建一个预分配函数,该函数返回一个包含您需要的所有变量的单一结构,然后用struct.varname 变体替换您的变量名。一般来说,我只会在一行代码上放置一个赋值,所以“所有变量都被预分配”的问题不应该以这种方式出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2019-01-29
    • 1970-01-01
    • 2011-04-28
    • 2016-01-01
    相关资源
    最近更新 更多