【发布时间】:2015-03-09 15:04:03
【问题描述】:
我有一些参数在 main.m 中的每个循环迭代中改变大小。我已将预分配放在另一个名为 preallocation.m 的脚本中。
当预分配被放置在另一个脚本中时,我会从 Matlab 收到有关主脚本中每个参数的警告,关于考虑预分配以提高速度。
有没有办法消除这些警告?如果我添加了另一个需要预分配的参数并且忘记了预分配,我希望收到该参数的警告。
【问题讨论】:
标签: matlab allocation
我有一些参数在 main.m 中的每个循环迭代中改变大小。我已将预分配放在另一个名为 preallocation.m 的脚本中。
当预分配被放置在另一个脚本中时,我会从 Matlab 收到有关主脚本中每个参数的警告,关于考虑预分配以提高速度。
有没有办法消除这些警告?如果我添加了另一个需要预分配的参数并且忘记了预分配,我希望收到该参数的警告。
【问题讨论】:
标签: matlab allocation
我很想使您的预分配脚本成为一个函数。然后你可以写类似的东西
[myvar1,myvar2,myvar3] = preallocate();
这将使您可以一目了然地查看所有预分配的变量,并且还会使 mlint 保持安静。
【讨论】:
在我的 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。请注意,我自己没有尝试过这个包,所以我不确定它的效果和速度。
【讨论】:
struct.varname 变体替换您的变量名。一般来说,我只会在一行代码上放置一个赋值,所以“所有变量都被预分配”的问题不应该以这种方式出现。