首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何声明句柄数组

如何声明句柄数组
EN

Stack Overflow用户
提问于 2018-01-18 06:16:44
回答 3查看 95关注 0票数 2

在MATLAB中使用循环填充数组时,代码分析器抛出警告The variable 'foo' changes appears to change size on every loop iteration. Consider preallocating for speed.

典型案例:

代码语言:javascript
复制
for ii=1:3
  foo(ii)=rand;
  bar{ii}=rand;
end

显然,这可以通过预分配轻松解决。

代码语言:javascript
复制
foo=nan(3,1);bar=cell(3,1);
for ii=1:3
  foo(ii)=rand;
  bar{ii}=rand;
end

问题是,当我不是填充数字或单元格数组,而是处理数组时,通常是一组可以从代码的不同部分访问的行。

我发现了一个向后走的循环:

代码语言:javascript
复制
for ii=3:-1:1
  foo(ii)=line(nan,nan);
end

但是,除了%#ok<*NASGU>%#ok<NASGU>评论之外,还有更好的方法来摆脱警告吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-18 06:24:16

由于您正在创建line对象,因此有一个专门的解决方法可以完全避免循环。您可以将一个值矩阵传递给line,以便为每列创建一行。例如,这将创建3个line对象,并以3x1矢量的形式存储手柄:

代码语言:javascript
复制
h = line(nan(2, 3), nan(2, 3));
票数 2
EN

Stack Overflow用户

发布于 2018-01-18 17:56:15

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-01-18 06:49:21

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

代码语言:javascript
复制
foo = zeros(3,1);
for ii=1:3
  foo(ii)=double(line(nan,nan));
end

您可以使用handle()方法将它们转换回句柄。但在大多数情况下,您不需要显式地执行此操作。可以直接将getset函数与数字表示一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48310915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档