matlab初始化对象数组
Posted
技术标签:
【中文标题】matlab初始化对象数组【英文标题】:matlab initialize array of objects 【发布时间】:2011-09-02 00:07:43 【问题描述】:我在 MATLAB 中使用 OOP,我有以下构造函数:
函数 obj = Squadron(num_fighters, num_targets, time_steps) 如果 nargin == 0 目标数 = 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 = zeros(num_fighters, num_targets); 结尾那个临时变量“a”闻起来很糟糕。有没有更好的方法来初始化一个对象数组,我希望有一个推送/弹出方法。我确信有更好的方法来做到这一点。
【问题讨论】:
惊奇的是你也可以直接在Shooter
构造函数中分配Shooter
数组:mathworks.com/help/techdoc/matlab_oop/brd4btr.html
我在构造函数中分配它,你知道比使用临时变量更干净的方法吗?也许我错过了什么。
“更干净的方式”是主观的......我的信息:它不仅适用于Squadron
,而且直接适用于Shooter
构造函数。
得到了你。我明白你在说什么。这样更干净。
可能重复:How to preallocate an array of class in MATLAB?
【参考方案1】:
看起来您正在尝试创建一个句柄对象(Shooters)数组并将其存储在另一个句柄对象(Squardron)的属性中。我有一个非常有帮助的similar problem discussion。
简而言之:您正在做的事情可能并不漂亮 - 但可能已经很不错了。
在 Matlab 中创建数组时,最好进行一些预分配以保留内存,从而显着提高性能。
在正常情况下是这样的:
a=zeros(1,1000);
for n=1:1000
a(n)=n;
end
(这里 a=1:1000;会更好)
对于对象,预分配通过将其中一个对象分配给数组中的最后一个字段来工作。然后,Matlab 用它通过调用不带参数的对象的构造函数创建的对象(句柄)填充其他字段(参见Matlab help)。因此,对象的预分配可能如下所示:
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;
再次 - 更多详情请参阅this discussion
【讨论】:
【参考方案2】:有几种方法可以处理这种情况...
Building object arrays in the constructor:
您可以修改您的Shooter
类,这样当您传递值数组时,它会创建一个对象数组。然后你可以像这样初始化ShooterArray
:
obj.ShooterArray = Shooter(repmat(num_targets,1,num_fighters),...
repmat(time_steps,1,num_fighters));
复制值类的实例:
如果Shooter
是value class,并且每个对象将完全相同相同(即,您不会将其任何默认属性初始化为随机值),那么您可以只创建一个对象并使用REPMAT 复制它:
obj.ShooterArray = repmat(Shooter(num_targets,time_steps),1,num_fighters);
不幸的是,如果Shooter
是handle class 的子类,则不能像使用值类一样复制它。当您确实需要许多单独的对象时,您实际上会将 references 复制到一个对象,每个对象都有自己唯一的引用。在这种情况下,您当前的代码可能是最好的解决方案。
【讨论】:
以上是关于matlab初始化对象数组的主要内容,如果未能解决你的问题,请参考以下文章