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初始化对象数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Matlab 类对象数组上调用 delete

可生成的matlab函数中的对象数组

在另一个类 MATLAB 中创建一个类的对象数组

对象数组

对象数组

对象数组