如何声明句柄数组

时间:2018-01-17 22:16:44

标签: arrays matlab handle

使用循环在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>评论之外,还有更简洁的方法来消除警告吗?

3 个答案:

答案 0 :(得分:2)

由于您正在创建线对象,因此特别针对该对象进行了解决,从而完全避免了循环。您可以将值矩阵传递给line,以便为每列创建一行。例如,这将创建3个线对象并将句柄存储在3×1向量中:

h = line(nan(2, 3), nan(2, 3));

答案 1 :(得分:1)

函数gobjects就是为此目的而设计的 - 它将返回一个预分配的matlab.graphics.GraphicsPlaceholder对象数组,其大小与您指定的一样。然后,您可以使用图形对象(如线条)填充数组。

请注意,您可以使用isgraphics有用地测试该数组的元素 - 实际图形句柄的元素将返回true,而GraphicsPlaceholder的元素将返回false

如果您特意要关闭警告,那么%#ok评论是正确的方法。您可以在“首选项”中全局关闭警告,这意味着您可以省略%#ok注释,但这意味着您会错过所有预分配的警告,而不仅仅是图形句柄数组。

答案 2 :(得分:0)

一种解决方案是将句柄存储在double数组中:

foo = zeros(3,1);
for ii=1:3
  foo(ii)=double(line(nan,nan));
end

您可以使用handle()方法将它们转换回句柄。但是大部分时间你都不需要明确地这样做。您可以直接使用getset函数和数字表示。