如何解决matlab初始化对象数组
| 我正在使用MATLAB中的OOP,并且具有以下构造函数: 函数obj =中队(num_fighters,num_targets,time_steps) 如果nargin == 0 num_targets = 100; time_steps = 100; num_fighters = 10; 结束 obj.num_shooters = num_fighters; 对于iShooter = 1:obj.num_shooters a(iShooter)=射手(num_targets,time_steps); 结束 obj.ShooterArray = a; obj.current_detections =零(num_fighters,num_targets); 结束 那个临时变量“ a”听起来很糟糕。有没有更好的方法来初始化对象数组,我希望有一个push / pop方法。我相信有更好的方法可以做到这一点。解决方法
看起来您正在尝试创建一个处理对象数组(Shooter)并将其存储在另一个处理对象(Squadron)的属性中。我进行了非常相似的问题讨论,可能会对您有所帮助。
简而言之:您正在做的事情可能并不漂亮-但可能已经很不错了。
在Matlab中创建数组时,通常最好做一些预分配以保留内存,这可以显着提高性能。
在正常情况下,如下所示:
a=zeros(1,1000);
for n=1:1000
a(n)=n;
end
(这里a = 1:1000;会更好)
对于对象,预分配是通过将对象之一分配给数组中的最后一个字段来进行的。然后,Matlab通过调用不带参数的对象的构造函数,用它创建的对象(句柄)填充其他字段(请参阅Matlab帮助)。因此,对象的预分配可能如下所示:
a(1,1000)=ObjectConstructor();
for n=1:1000
a(n)=ObjectConstructor();
end
或简单地
for n=1000:-1:1
a(n)=ObjectConstructor();
end
确保可以不带任何参数调用Shooter,您应该可以执行以下操作:
for iShooter = obj.num_shooters:-1:1
obj.ShooterArray(iShooter) = Shooter(num_targets,time_steps);
end
但是,事实证明,由于某种原因,将对象数组直接存储在另一个对象的属性中会导致非常差的性能。 (在这种情况下,数组预分配可能无法正常工作)。因此,在这种情况下,使用辅助变量并立即向属性分配整个数组是提高性能的一个好主意。
我会尝试:
for iShooter = obj.num_shooters:-1:1
a(iShooter) = Shooter(num_targets,time_steps);
end
obj.ShooterArray = a;
再次-有关更多详细信息,请参见此讨论
,有两种方法可以处理这种情况...
在构造函数中构建对象数组:
您可以修改“ 5”类,以便在传递值数组时创建对象数组。然后可以像这样初始化ShooterArray
:
obj.ShooterArray = Shooter(repmat(num_targets,1,num_fighters),...
repmat(time_steps,num_fighters));
复制值类的实例:
如果Shooter
是一个值类,并且每个对象都将完全相同(即您没有将其默认属性初始化为随机值),则可以只创建一个对象并使用REPMAT复制它:
obj.ShooterArray = repmat(Shooter(num_targets,time_steps),num_fighters);
不幸的是,如果ѭ5是句柄类的子类,则不能像使用值类一样复制它。实际上,当您确实需要多个单独的对象,每个对象都有自己的唯一引用时,实际上您将复制对一个对象的引用。在这种情况下,您当前的代码可能是最好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。