在MATLAB中使用循环填充数组时,代码分析器抛出警告The variable 'foo' changes appears to change size on every loop iteration. Consider preallocating for speed.
典型案例:
for ii=1:3
foo(ii)=rand;
bar{ii}=rand;
end显然,这可以通过预分配轻松解决。
foo=nan(3,1);bar=cell(3,1);
for ii=1:3
foo(ii)=rand;
bar{ii}=rand;
end问题是,当我不是填充数字或单元格数组,而是处理数组时,通常是一组可以从代码的不同部分访问的行。
我发现了一个向后走的循环:
for ii=3:-1:1
foo(ii)=line(nan,nan);
end但是,除了%#ok<*NASGU>或%#ok<NASGU>评论之外,还有更好的方法来摆脱警告吗?
发布于 2018-01-18 06:24:16
由于您正在创建line对象,因此有一个专门的解决方法可以完全避免循环。您可以将一个值矩阵传递给line,以便为每列创建一行。例如,这将创建3个line对象,并以3x1矢量的形式存储手柄:
h = line(nan(2, 3), nan(2, 3));发布于 2018-01-18 17:56:15
函数gobjects就是为此目的而设计的-它将返回一个预先分配的具有您指定大小的matlab.graphics.GraphicsPlaceholder对象数组。然后,可以使用图形对象(如线)填充阵列。
请注意,您可以使用isgraphics测试该数组的元素-作为实际图形句柄的元素将返回true,而作为GraphicsPlaceholder的元素将返回false。
如果你特别想关闭警告,那么%#ok注释是正确的方法。您可以在首选项中全局关闭警告,这意味着您可以省略%#ok注释,但这将意味着您将错过所有预分配的警告,而不仅仅是图形句柄数组。
发布于 2018-01-18 06:49:21
一种解决方案是将句柄存储在double数组中:
foo = zeros(3,1);
for ii=1:3
foo(ii)=double(line(nan,nan));
end您可以使用handle()方法将它们转换回句柄。但在大多数情况下,您不需要显式地执行此操作。可以直接将get和set函数与数字表示一起使用。
https://stackoverflow.com/questions/48310915
复制相似问题