我在MATLAB中玩OOP,我有以下构造函数:
function obj = Squadron(num_fighters, num_targets, time_steps)
if nargin == 0
num_targets = 100;
time_steps = 100;
num_fighters = 10;
end
obj.num_shooters = num_fighters;
for iShooter = 1:obj.num_shooters
a(iShooter) = Shooter(num_targets, time_steps);
end
obj.ShooterArray = a;
obj.current_detections = zeros(num_fighters, num_targets);
end
那个临时变量'a'闻起来很可怕.有没有更好的方法来初始化一个对象数组,我希望有一个推/弹方法.我相信有更好的方法可以做到这一点.
我经常发现自己在做这样的事情:
unprocessedData = fetchData(); % returns a vector of structs or objects
processedData = []; % will be full of structs or objects
for dataIdx = 1 : length(unprocessedData)
processedDatum = process(unprocessedData(dataIdx));
processedData = [processedData; processedDatum];
end
Run Code Online (Sandbox Code Playgroud)
尽管功能强大,但并不是最佳选择- processedData向量在循环内增长。甚至mlint警告我,我应该考虑预先分配速度。
如果数据是的向量int8,我可以这样做:
% preallocate processed data array to prevent growth in loop
processedData = zeros(length(unprocessedData), 1, 'int8');
Run Code Online (Sandbox Code Playgroud)
并修改循环以填充向量插槽,而不是连接起来。
有没有一种方法可以预分配向量,以便随后可以容纳结构或对象?
更新:受Azim的回答启发,我只是颠倒了循环顺序。首先处理最后一个元素将在第一次命中时强制整个向量进行预分配,因为调试器确认:
unprocessedData = fetchData();
% note that processedData isn't declared outside the loop - this …Run Code Online (Sandbox Code Playgroud) 有没有办法在MATLAB中"声明"具有特定用户定义类型的变量?zeros()仅适用于内置数值类型.我提出的唯一解决方案是使用repmat()复制虚拟对象零次:
arr = repmat(myClass(), [1 0])
Run Code Online (Sandbox Code Playgroud)
如果不以这种方式声明变量,任何执行"arr(end + 1)= myClass()"的代码都必须包含默认空矩阵的特殊情况,该矩阵的类型为double.
我错过了一些更明智的事吗?